軟體設計原則—介面隔離原則

燕子去了發表於2024-05-19

B類需要方法1

image

好處是b類繼承A類後就有了方法1的功能,問題是B類被迫有了它不使用的方法2

這個其實是根據方法的職責細分介面,只需要依賴其中一個介面就可以了

image

這個原則針對的是介面,不適用於抽象類。介面拆分是職責拆分。抽象類是規則定義,不可隨意拆分。
介面方法加上defult就可以選擇實現了,實現類可以選擇性實現方法


客戶端不應該被迫依賴於它不使用的方法;一個類對另一個類的依賴應該建立在最小的介面上。

下面看一個例子來理解介面隔離原則:安全門案例

我們需要建立一個A品牌的安全門,該安全門具有防火、防水、防盜的功能。可以將防火,防水,防盜功能提取成一個介面,形成一套規範。類圖如下:

image

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介面就違背了介面隔離原則,那麼我們如何進行修改呢?看如下類圖:

image

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

}

相關文章