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