設計模式系列之設計原則(4)介面隔離原則
阿新 • • 發佈:2020-10-28
定義
1. 客戶端不應該依賴它不需要的介面。
2. 類間的依賴關係應建立在最小的介面上。
以上兩個定義描述了介面隔離原則的基本含義:不要建立上帝介面(解決所有問題的介面)或胖介面(解決很多問題的介面),要為類建立需要的專用、小介面。介面隔離實質上是對介面功能進行劃分,將不同功能的程式碼分別“隔離”到不同的介面中。該原則和單一職責原則都要求設計者對業務進行拆分處理,最終達到低耦合高內聚的設計目標。兩者的區別在於:
- 約束物件不同。顯而易見,介面隔離原則是針對介面層面,包括介面和抽象類,在構建低層基礎框架過程中發揮作用。單一職責原則針對實現類層面,包括類、介面和方法,在實現業務程式碼細節過程中發揮作用。
- 強調目標不同。介面隔離原則的視角對準大的功能模組,強調對大模組的職責分割,分割後實現類中不存在無用的方法,介面間具備低耦合性。單一職責原則的視角對準單個類(介面或方法)內部,強調類(介面或方法)自身功能單一,具備高內聚性。
作用
遵循介面隔離原則的介面設計具備以下優點:
- 降低因變更引入錯誤的擴散。因為介面對實現類具備專一性,需求功能變更引起的介面變化只會擴散到功能一致的程式碼中。
- 減少程式碼冗餘。一個介面只規範相關功能,實現類中不存在無用的方法。
- 降低單個介面的複雜度,介面規範的功能較專一。
- 降低系統耦合。介面規範的功能較專一,會減少介面間的互動,系統整體的耦合會降低。
實現方法
- 基於業務需求,對介面功能包含的功能進行有限的拆分。理想情況下,一個介面只服務一個子模組或業務邏輯。
- 同單一職責類似,實現類可通過實現多個介面完成業務需求。
程式碼實踐
同不遵循單一職責原則的介面的介面層面類似,程式碼如下
//介面包含了兩項功能
public interface ICourse {
//獲取課程名稱
String getCourseName();
//管理課程
void managerCourse();
}
對上面介面進行拆分,得到兩個介面如下
//定義獲取課程名稱的規範 public interface IGetName { //獲取課程名稱 String getCourseName(); } //定義管理課程的操作 public interface IManagerCourse { //管理課程 void managerCourse(); }
同類不同的是,實現類可以繼承多個介面,進行對功能進行組裝,如下面程式碼
//實現兩個介面,具備兩個介面定義的功能
public class StudyCourse implements ICourse, IManagerCourse {
@Override
public String getCourseName() {
System.out.println("java課程");
return "java課程";
}
@Override
public void managerCourse() {
System.out.println("管理課程");
}
}
顯然,這種方式對應的類圖如下