B類需要方法1
好處是b類繼承A類後就有了方法1的功能,問題是B類被迫有了它不使用的方法2
這個其實是根據方法的職責細分介面,只需要依賴其中一個介面就可以了
這個原則針對的是介面,不適用於抽象類。介面拆分是職責拆分。抽象類是規則定義,不可隨意拆分。
介面方法加上defult就可以選擇實現了,實現類可以選擇性實現方法
客戶端不應該被迫依賴於它不使用的方法;一個類對另一個類的依賴應該建立在最小的介面上。
下面看一個例子來理解介面隔離原則:安全門案例
我們需要建立一個A品牌的安全門,該安全門具有防火、防水、防盜的功能。可以將防火,防水,防盜功能提取成一個介面,形成一套規範。類圖如下:
SafetyDoor安全門介面有全部的功能
package com.lmcode.principles.Interfaceisolationprinciple;
public interface SafetyDoor {
void waterproof();
void fireproof();
void antiTheft();
}
ASafetyDoor
package com.lmcode.principles.Interfaceisolationprinciple;
public class ASafetyDoor implements SafetyDoor{
public void antiTheft() {
System.out.println("防盜");
}
public void fireproof() {
System.out.println("防火");
}
public void waterproof() {
System.out.println("防水");
}
}
BSafetyDoor
package com.lmcode.principles.Interfaceisolationprinciple;
public class BSafetyDoor implements SafetyDoor{
public void antiTheft() {
System.out.println("防盜");
}
@Override
public void waterproof() {
}
public void fireproof() {
System.out.println("防火");
}
}
main
package com.lmcode.principles.Interfaceisolationprinciple;
public class main {
public static void main(String[] args) {
ASafetyDoor a = new ASafetyDoor();
a.antiTheft();
a.fireproof();
a.waterproof();
BSafetyDoor b = new BSafetyDoor();
b.antiTheft();
b.fireproof();
}
}
上面的設計我們發現了它存在的問題,A品牌的安全門具有防盜,防水,防火的功能。現在如果我們還需要再建立一個B品牌的安全門,而該安全門只具有防盜、防水功能呢?很顯然如果實現SafetyDoor介面就違背了介面隔離原則,那麼我們如何進行修改呢?看如下類圖:
AntiTheft
package com.lmcode.principles.InterfaceisolationprinciplePro;
public interface AntiTheft {
void antiTheft();
}
Fireproof
package com.lmcode.principles.InterfaceisolationprinciplePro;
public interface Fireproof {
void fireproof();
}
Waterproof
package com.lmcode.principles.InterfaceisolationprinciplePro;
public interface Waterproof {
void waterproof();
}
ASafetyDoor
package com.lmcode.principles.InterfaceisolationprinciplePro;
public class ASafetyDoor implements AntiTheft,Fireproof,Waterproof {
public void antiTheft() {
System.out.println("防盜");
}
public void fireproof() {
System.out.println("防火");
}
public void waterproof() {
System.out.println("防水");
}
}
BSafetyDoor
package com.lmcode.principles.InterfaceisolationprinciplePro;
public class BSafetyDoor implements AntiTheft,Fireproof {
public void antiTheft() {System.out.println("防盜");}
public void fireproof() {System.out.println("防火");}
}