Interface Segregation Principle (ISP)
定義:
客戶端不應該被強迫依賴不需要的方法。(介面應該只提供客戶端需要的方法)
說明:
一個過大的 interface ,通常代表其中有某些功能是客戶端不需要的,如果客戶端實作了不需要的功能 ,這些功能會造成不必要的耦合。
我們可以把過大的 interface 分離,將其中某些功能拆離到另一個 interface 中。
Example Code:
回到 OCP 的初始範例,其中 Bike , Car 都有類似的方法( driveBike , driveCar)。
public class Bike {
public void driveBike(){
System.out.println("drive Bike");
}
}
public class Car {
public void driveCar(){
System.out.println("drive Car");
}
public void openWindow(){
System.out.println("open window");
}
}
現在必須建立抽象層 Vehicle,和 OCP 不同的是我們把 openWindow 也放到 Vehicle 中。
public interface Vehicle {
public void drive();
public void openWindow();
}
對 Bike 而言,必須實作 openWindow 行為,但該行為對 Bike 是沒有意義,也違反了 ISP。
public class Bike implements Vehicle{
public void drive(){
System.out.println("drive Bike");
}
@Override
public void openWindow() {
// unmeaning action for Bike
}
}
為了遵循 ISP,可以另外建立 Window 介面,並把 openWindow 移到 Window 介面中。
public interface Window {
public void openWindow();
}
現在 Bike 可以不必實作 openWindow 方法。
public class Bike implements Vehicle{
public void drive(){
System.out.println("drive Bike");
}
}