软件设计原则—接口隔离原则

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

}
posted @ 2024-05-19 18:46  燕子去了  阅读(19)  评论(0)    收藏  举报

Powered by .NET 8.0 on Kubernetes

我会翻山越岭,到每一个我想去的地方

...