Java设计模式-软件设计原则-接口隔离原则

岳庆锦

发布于 2022.03.08 21:00 阅读 5519 评论 0

接口隔离原则

 定义:客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。

 应用:下面通过“安全门”案例来理解接口隔离原则。

 需求:我们需要创建一个黑马品牌的安全门,该安全门具有防火、防水、防盗的功能。

 分析:在学习接口隔离原则之前,我们可能会想到将防火、防水和防盗功能提取成一个接口(SafetyDoor),然后让具体实现类(HeimaSafetyDoor)实现此接口,此时我们就实现了需求。

1.安全门接口(SafetyDoor)

public interface SafetyDoor {
    //防火
    void fireProof();

    //防水
    void waterProof();

    //防盗
    void antiTheft();
}

2.黑马品牌的安全门(HeimaSatetyDoor)

public class HeimaSafetyDoor implements SafetyDoor{

    @Override
    public void fireProof() {
        System.out.println("防火");
    }

    @Override
    public void waterProof() {
        System.out.println("防水");
    }

    @Override
    public void antiTheft() {
        System.out.println("防盗");
    }
}

3.测试类

public class Client {
    public static void main(String[] args) {
        //创建黑马品牌的安全门
        HeimaSafetyDoor door = new HeimaSafetyDoor();
        //调用功能
        door.fireProof();
        door.waterProof();
        door.antiTheft();
    }
}

4.运行结果

 结果分析:上面的程序看似没有问题,但如果我们还需要再创建一个传智品牌的安全门(ItcastSafetyDoor),但该安全门只具有防火和防盗的功能。此时我们依然让ItcastSafetyDoor类实现SafetyDoor接口,这虽然满足了传智安全门的功能,但它也同时被迫具备了不使用的防水功能。这就违背了接口隔离原则(客户端不应该被迫依赖于它不使用的方法)。

 改进方法:采用接口隔离原则,将安全门的接口(SafetyDoor)拆分成防火接口(FireProof)、防水接口(WaterProof)和防盗的接口(AntiTheft)。(接口隔离原则要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法)

 改进后的代码(黑马牌安全门)

1.防火接口(FireProof

public interface FireProof {
    void fireProof();
}

2.防水接口(WaterProof

public interface WaterProof {
    void waterProof();
}

3.防盗接口(AntiTheft

public interface AntiTheft {
    void antiThef();
}

4.黑马牌安全门(HeimaSafetyDoor)

public class HeiMaSaftyDoor implements AntiTheft, FireProof, WaterProof {
    @Override
    public void antiThef() {
        System.out.println("防盗");
    }

    @Override
    public void fireProof() {
        System.out.println("防火");
    }

    @Override
    public void waterProof() {
        System.out.println("防水");
    }
}

5.测试类

public class Client {
    public static void main(String[] args) {

        //创建黑马牌安全门对象
        HeiMaSaftyDoor door = new HeiMaSaftyDoor();
        //调用功能
        door.antiThef();
        door.fireProof();
        door.waterProof();
  }
}

6.运行结果

 增加传智品牌的安全门:只需要新增一个类(ItcastSafetyDoor),不需要修改原本的代码,而且只具备防火和防盗的功能,遵循了接口隔离原则。

public class ItcastSaftyDoor implements FireProof,AntiTheft{
    @Override
    public void antiThef() {
        System.out.println("防盗");
    }

    @Override
    public void fireProof() {
        System.out.println("防火");
    }
}

测试类:

public class Client {
    public static void main(String[] args) {

        //创建黑马牌安全门对象
        HeiMaSaftyDoor door = new HeiMaSaftyDoor();
        //调用功能
        door.antiThef();
        door.fireProof();
        door.waterProof();

        System.out.println("================");

        //创建传智安全门对象
        ItcastSaftyDoor door1 = new ItcastSaftyDoor();
        //调用功能
        door1.antiThef();
        door1.fireProof();
    }
}

运行结果:

 接口隔离原则优点

1.将臃肿庞大的接口分解为多个粒度小的接口,提高系统的灵活性和可维护性。

2.接口隔离提高了系统的内聚性,减少了对外交互,降低了系统的耦合性。

3.如果接口的粒度大小定义合理,能够保证系统的稳定性;但是,如果定义过小,则会造成接口数量过多,使设计复杂化;如果定义太大,会使灵活性降低。