精通介面隔離原則,輕鬆實現高內聚、低耦合架構
來源:mikechen的網際網路架構
介面隔離原則是實現高內聚、低耦合系統的基石。
介面隔離原則旨在解決介面設計的問題。透過將大介面拆分成多個小介面,讓每個介面專注服務於一個子模組或業務邏輯,讓系統更加靈活、可維護。
例如:家中的智慧家居系統,有電視、電腦、窗簾、電燈等。
圖左:遵循介面隔離
對具有相同功能的裝置,配備獨立遙控器,每個遙控器專注提供特定裝置的控制按鈕。
如果需要開燈,就用燈光遙控器,非常便捷。更改某個裝置,也不會影響其他裝置。
圖右:不遵循介面隔離
透過一個多功能的遙控器,來控制所有裝置。
遙控器按鈕太多,很難快速找到需要的功能。
按鈕之間耦合度高。修改任一裝置,都可能牽一髮而動全身。
要同時處理多種裝置的功能,職責混雜,違背單一職責原則。
本文,我們深入接口隔離原則,力求透過圖解、原始碼剖析到位。
大家好,我是 mikechen。
介面隔離是良好架構設計的基石,面試常考,非常重要。 為方便大家系統學習,我已將本文歸納到《阿里架構師進階專題合集》。 需要的同學,拉到文末獲取。
介面隔離原則( ISP),英文全稱 Interface Segregation Principle 。
介面隔離原則是指不應該強行要求客戶端依賴於它們不用的介面,類之間的依賴應該建立在最小的介面上面。
簡單理解:
客戶端需要什麼介面,就提供什麼介面,不需要的就不依賴。
將大介面拆分成多個小介面,每個介面只專注服務於一個子模組或業務邏輯。
使用抽象類或預設方法,來減少介面的改動對原有程式碼的影響。
介面隔離原則的提出,是為了解決介面過大所帶來的問題,提高系統的靈活性和可維護性。
如果客戶端依賴了不需要的介面,將增加客戶端和介面之間的耦合度,與“高內聚、低耦合”的思想相矛盾。
如果一個介面中包含了很多不相關的方法,要實現這個介面的類,就必須實現所有的方法。
在軟體設計最初,我們的想法是將相同功能的方法放在同一個介面裡面。
理論上來說,這貌似沒錯,我們來看看如何設計。
例如:
類 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)介面設計避免過大或過小。過大可能導致實現類需要實現大量不必要的方法;而過小可能導致需要實現的介面數量過多,系統設計會變得很複雜。
看到這裡,是不是覺得介面隔離和單一職責有些相似?
其實不然,下面介紹。
從功能上來看,介面隔離和單一職責確實有一定的相似性。
兩者都是為了降低它們之間的耦合性,體現了封裝的思想。
但是,兩者的側重點卻不同:
單一職責原則:關注類的職責,針對程式實現和細節,偏向於業務;
介面隔離原則:關注對介面依賴的隔離,針對抽象和程式整體框架的構建,偏向於架構設計。
單一職責原則的詳解篇:吃透單一職責原則,100倍效果提升程式碼質量
兩篇一定要結合看,更容易融會貫通。
介面隔離原則透過將大介面拆分成多個小介面,讓每個介面只專注服務於一個子模組或者業務邏輯,讓系統更加靈活、可維護。
介面隔離原則的核心是介面細化,介面細化要合理,結合系統的實際需求,以適度設計為前提,既小而精確。
建議收藏備用,划走就再也找不到了。
介面隔離原則是良好架構設計的基石,社/校招面試也常問,非常重要。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024922/viewspace-2992689/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 高內聚,低耦合的實現方式
- 高內聚低耦合
- Java 工程解耦即高內聚低耦合Java解耦
- 設計原則之【介面隔離原則】
- 設計原則:介面隔離原則(ISP)
- 軟體設計原則—介面隔離原則
- 設計模式:介面隔離原則設計模式
- 分散式系統關注點——「高內聚低耦合」詳解分散式
- 必知必會的設計原則——介面隔離原則
- 反射、特性、依賴注入、介面隔離原則反射依賴注入
- 深入理解介面隔離原則:構建靈活的面向介面軟體
- 設計模式六大原則(四)----介面隔離原則設計模式
- 設計模式的七大原則(2) --介面隔離原則設計模式
- 嘻哈說:設計模式之介面隔離原則設計模式
- 面象物件設計6大原則之四:介面隔離原則物件
- 高聚合低耦合 - theregister
- 編碼最佳實踐——介面分離原則
- PouchContainer支援LXCFS實現高可靠容器隔離AI
- 如何設計一個高內聚低耦合的模組——MegEngine 中自定義 Op 系統的實踐經驗
- 六邊形架構:使用事件驅動的無伺服器實現鬆耦合 - Ellerby架構事件伺服器
- 如何實現軟體設計中的高凝聚和鬆耦合? - thevaluable
- [分散式]架構設計原則--高併發分散式架構
- SpringBoot實戰:輕鬆實現介面資料脫敏Spring Boot
- 微服務架構之「 容錯隔離 」微服務架構
- 如何實現css隔離?CSS
- Java高階架構面試知識點:基於 Hystrix 訊號量機制實現資源隔離Java架構面試
- PHP身份實名認證介面小白也能輕鬆實現,ocr介面PHP
- SOLID架構設計原則Solid架構
- Java高階架構面試知識點整理:基於 Hystrix 執行緒池技術實現資源隔離Java架構面試執行緒
- 看懂架構設計中的服務隔離架構
- 技術解析系列 | PouchContainer 支援 LXCFS 實現高可靠容器隔離AI
- 輕鬆構建基於 Serverless 架構的小程式Server架構
- MySQL是如何實現事物隔離?MySql
- Salesforce架構的10條原則Salesforce架構
- Apache 架構師總結的 30 條架構原則Apache架構
- 輕鬆實現報表整合
- 核心介面隔離,要做哪些事情?
- MHA高可用架構的實現方式架構