1. 程式人生 > 實用技巧 >設計模式系列之設計原則(4)介面隔離原則

設計模式系列之設計原則(4)介面隔離原則

定義

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("管理課程");
    }
}

顯然,這種方式對應的類圖如下

參考資料