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");
    }
}