精通介面隔離原則,輕鬆實現高內聚、低耦合架構

帶你聊技術發表於2023-11-03

來源:mikechen的網際網路架構

介面隔離原則是實現高內聚、低耦合系統的基石。

介面隔離原則旨在解決介面設計的問題。透過將大介面拆分成多個小介面,讓每個介面專注服務於一個子模組或業務邏輯,讓系統更加靈活、可維護。

例如:家中的智慧家居系統,有電視、電腦、窗簾、電燈等。

精通介面隔離原則,輕鬆實現高內聚、低耦合架構

圖左:遵循介面隔離

對具有相同功能的裝置,配備獨立遙控器,每個遙控器專注提供特定裝置的控制按鈕。

如果需要開燈,就用燈光遙控器,非常便捷。更改某個裝置,也不會影響其他裝置。

圖右:不遵循介面隔離

透過一個多功能的遙控器,來控制所有裝置

  • 遙控器按鈕太多,很難快速找到需要的功能。


  • 按鈕之間耦合度高。修改任一裝置,都可能牽一髮而動全身。


  • 要同時處理多種裝置的功能,職責混雜,違背單一職責原則。


本文,我們深入接口隔離原則,力求透過圖解、原始碼剖析到位

大家好,我是 mikechen。

介面隔離是良好架構設計的基石,面試常考,非常重要。
為方便大家系統學習,我已將本文歸納到《阿里架構師進階專題合集》。
需要的同學,拉到文末獲取。

精通介面隔離原則,輕鬆實現高內聚、低耦合架構

01
   介面隔離原則的定義

介面隔離原則( ISP),英文全稱 Interface Segregation Principle 。

介面隔離原則是指不應該強行要求客戶端依賴於它們不用的介面,類之間的依賴應該建立在最小的介面上面。

簡單理解:

  • 客戶端需要什麼介面,就提供什麼介面,不需要的就不依賴。


  • 將大介面拆分成多個小介面,每個介面只專注服務於一個子模組或業務邏輯。


  • 使用抽象類或預設方法,來減少介面的改動對原有程式碼的影響。


02
  介面隔離原則的由來

介面隔離原則的提出,是為了解決介面過大所帶來的問題,提高系統的靈活性和可維護性。

  • 如果客戶端依賴了不需要的介面,將增加客戶端和介面之間的耦合度,與“高內聚、低耦合”的思想相矛盾。

  • 如果一個介面中包含了很多不相關的方法,要實現這個介面的類,就必須實現所有的方法。


03
  介面隔離原則示例

在軟體設計最初,我們的想法是將相同功能的方法放在同一個介面裡面。

理論上來說,這貌似沒錯,我們來看看如何設計。

例如:

類 A 透過介面 I 依賴類 B,類 C 透過介面 I 依賴類 D。

那麼,對於類 A 和類 B 來說,介面 I 不是最小介面,則類 B 和類 D 必須去實現它們不需要的方法。

精通介面隔離原則,輕鬆實現高內聚、低耦合架構

如圖:

類 A 依賴介面 I 中的方法 1、方法 2、方法 3,類 B 是對類 A 依賴的實現。

類 C 依賴介面 I 中的方法 1、方法 4、方法 5,類 D 是對類 C 依賴的實現。

對於類 B 和類 D 來說,雖然都有用不到的方法(紅色字型),但由於實現了介面 I,所以也必須要實現這些用不到的方法。

程式碼示例:































interface I {    public void method1();    public void method2();    public void method3();    public void method4();    public void method5();}
class A{    public void depend1(I i){        i.method1();    }    public void depend2(I i){        i.method2();    }    public void depend3(I i){        i.method3();    }}
class B implements I{    public void method1() {        System.out.println("類B實現介面I的方法1");    }    public void method2() {        System.out.println("類B實現介面I的方法2");    }    public void method3() {        System.out.println("類B實現介面I的方法3");    }

對於類 D 來說,method2 和 method3 不是必需的。

但是,由於介面 A 中有這兩個方法,即使它們沒有作用,在實現時,也要同時實現這兩個方法。

























    public void method2() {}    public void method3() {}
   public void method4() {        System.out.println("類D實現介面I的方法4");    }    public void method5() {        System.out.println("類D實現介面I的方法5");    }}
public class Client{    public static void main(String[] args){        A a = new A();        a.depend1(new B());        a.depend2(new B());        a.depend3(new B());
       C c = new C();        c.depend1(new D());        c.depend2(new D());        c.depend3(new D());    }}

當介面過多時,對依賴於它的類來說,介面中的方法有沒有用,實現類中都必須去實現這些方法。

這樣的架構設計很不合理,明顯與“高內聚、低耦合”的思想相悖。

在程式設計中,依賴幾個專用的介面,要比依賴一個綜合的介面更靈活。

為了遵循介面隔離原則,我們將一個龐大的介面,拆分為 3 個專用的介面。

例如,將介面 I 拆分為介面 I1、介面 I2、介面 I3。

精通介面隔離原則,輕鬆實現高內聚、低耦合架構

程式碼示例:






























































interface I1 {    public void method1();}
interface I2 {    public void method2();    public void method3();}
interface I3 {    public void method4();    public void method5();}
class A{    public void depend1(I1 i){        i.method1();    }    public void depend2(I2 i){        i.method2();    }    public void depend3(I2 i){        i.method3();    }}
class B implements I1, I2{    public void method1() {        System.out.println("類B實現介面I1的方法1");    }    public void method2() {        System.out.println("類B實現介面I2的方法2");    }    public void method3() {        System.out.println("類B實現介面I2的方法3");    }}
class C{    public void depend1(I1 i){        i.method1();    }    public void depend2(I3 i){        i.method4();    }    public void depend3(I3 i){        i.method5();    }}
class D implements I1, I3{    public void method1() {        System.out.println("類D實現介面I1的方法1");    }    public void method4() {        System.out.println("類D實現介面I3的方法4");    }    public void method5() {        System.out.println("類D實現介面I3的方法5");    }}

每個類只需實現與其功能相關的介面,不需要的方法則不用去實現,極大提高了系統的可維護性和靈活性。

需要注意的是,對介面拆分要合理:

1)介面拆分應該儘量小,且專注於一個明確定義的功能領域。

2)介面設計避免過大或過小。過大可能導致實現類需要實現大量不必要的方法;而過小可能導致需要實現的介面數量過多,系統設計會變得很複雜。

看到這裡,是不是覺得介面隔離和單一職責有些相似?

其實不然,下面介紹。


04
  介面隔離原則和單一職責原則的區別

從功能上來看,介面隔離和單一職責確實有一定的相似性。

兩者都是為了降低它們之間的耦合性,體現了封裝的思想。

但是,兩者的側重點卻不同:

  • 單一職責原則:關注類的職責,針對程式實現和細節,偏向於業務;


  • 介面隔離原則:關注對介面依賴的隔離,針對抽象和程式整體框架的構建,偏向於架構設計。

 

單一職責原則的詳解篇:吃透單一職責原則,100倍效果提升程式碼質量

兩篇一定要結合看,更容易融會貫通。


總結
  

介面隔離原則透過將大介面拆分成多個小介面,讓每個介面只專注服務於一個子模組或者業務邏輯,讓系統更加靈活、可維護。

介面隔離原則的核心是介面細化,介面細化要合理,結合系統的實際需求,以適度設計為前提,既小而精確。

建議收藏備用,划走就再也找不到了。

介面隔離原則是良好架構設計的基石,社/校招面試也常問,非常重要。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2992689/,如需轉載,請註明出處,否則將追究法律責任。

相關文章