接口隔離原則(Interface Segregation Principle, ISP)

目錄

design pattern 以java 為例

解釋

SOLID原則之一,由羅伯特·C·馬丁(Robert C. Martin)提出。ISP強調應當將“胖接口”(fat
interfaces,即那些擁有太多方法的接口)拆分成更小、更專注的接口,這樣可以避免類別依賴它們不需要的接口,從而降低系統的耦合度,提高其靈活性和可維護性。

特點

  • 降低耦合度:通過拆分接口,類別之間的依賴關係變得更加清晰,減少了耦合度,使系統更容易理解和維護。
  • 提高系統的靈活性:當接口被細分,修改一個接口的行為或增加新的接口實現對其他接口的影響最小,從而增強了系統的靈活性。
  • 促進模塊化:ISP促使開發者設計出更小的、職責單一的模塊,這些模塊可以被獨立開發和更新,從而加快開發速度。

範例

錯誤

如果想要做動物的接口,並讓動物做實現,全部放同一個街口時會造成必須實現不必要的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
interface AnimalBehavior {
void eat();
void sleep();
void fly();
void swim();
}

class Dog implements AnimalBehavior {
public void eat() {
// 實現吃的行為
}

public void sleep() {
// 實現睡覺的行為
}

public void fly() {
// 對狗來說,這是無意義的
throw new UnsupportedOperationException();
}

public void swim() {
// 實現游泳的行為
}
}

修正

將各功能做切分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface Eatable {
void eat();
}

interface Sleepable {
void sleep();
}

interface Flyable {
void fly();
}

interface Swimmable {
void swim();
}

在依功能做實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Dog implements Eatable, Sleepable, Swimmable {
public void eat() {
// 實現吃的行為
}

public void sleep() {
// 實現睡覺的行為
}

public void swim() {
// 實現游泳的行為
}
}

class Bird implements Eatable, Sleepable, Flyable {
public void eat() {
// 實現吃的行為
}

public void sleep() {
// 實現睡覺的行為
}

public void fly() {
// 實現飛行的行為
}
}

商業案例

智慧家庭系統

在一個智慧家庭系統中,不同的設備如燈光、空調、安全攝像頭可能支持開啟/關閉、調節亮度、檢測運動等不同功能。透過將功能分解成細小的接口,各個設備只需要實現對它們有意義的接口。

插件系統

對於一個支持插件的系統,各種插件可能會提供不同的功能,如數據分析、報告生成等。通過將這些功能分解成單獨的接口,插件開發者可以只實現他們感興趣的功能,而不是被迫實現一個包含所有可能功能的大接口。
通過這種方式,接口隔離原則(ISP)有助於建立更清晰、更靈活且易於維護的系統架構。


接口隔離原則(Interface Segregation Principle, ISP)
https://shengshengyang.github.io/2024/04/01/isp/
作者
Dean Yang
發布於
2024年4月1日
許可協議