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

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

 

 

 B类继承A类,拥有了方法1的功能,B类现只需要方法1的功能,不需要方法2的功能,被迫依赖于它不使用的方法2,改进--》方法1写在A接口,方法2写在B接口 C类需要方法1只需要实现 A接口,需要方法2 再次实现一个B接口就好了。

下面看一个例子来理解接口隔离原则

【例】安全门案例

我们需要创建一个黑马品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。类图如下:

 

SafetyDoor(接口):

package com.mangoubiubiu.designpractice.jkgl.before;

public interface SafetyDoor {
    void antiTheft();
    void fireproof();
    void waterproof();
}
HeiMaSafetyDoor(接口):
复制代码
package com.mangoubiubiu.designpractice.jkgl.before;

public class HeiMaSafetyDoor implements SafetyDoor {


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

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

    }

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

    }
}
复制代码

MainClient(接口):

复制代码
package com.mangoubiubiu.designpractice.jkgl.before;

public class MainClient {
    public static void main(String[] args) {
        HeiMaSafetyDoor heiMaSafetyDoor =new HeiMaSafetyDoor();
        heiMaSafetyDoor.antiTheft();
        heiMaSafetyDoor.fireproof();
        heiMaSafetyDoor.waterproof();
    }

}
复制代码

增加减少功能需要修改上层接口 ,万一下游接口依赖上层接口依赖的过多,改动的话影响面就很大

上面的设计我们发现了它存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一个传智品牌的安全门,而该安全门只具有防盗、防水功能呢?很显然如果实现SafetyDoor接口就违背了接口隔离原则,那么我们如何进行修改呢?看如下类图:

AntiTheft(接口):

package com.mangoubiubiu.designpractice.jkgl.before;

public interface AntiTheft {
    void antiTheft();
}

Fireproof(接口):

package com.mangoubiubiu.designpractice.jkgl.before;

public interface Fireproof {
    void fireproof();
}

Waterproof(接口):

package com.mangoubiubiu.designpractice.jkgl.before;

public interface Waterproof {
    void waterproof();
}

HeiMaSafetyDoor(类):

复制代码
package com.mangoubiubiu.designpractice.jkgl.before;

public class HeiMaSafetyDoor implements AntiTheft,Fireproof,Waterproof{

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

    public void fireproof() {
        System.out.println("防火");
    }


    public void waterproof() {
        System.out.println("防水");
    }
}
复制代码

从上面看出,想要哪个功能就实现哪个功能的接口,这样易扩展,和易维护。

 

 

本文作者:KwFruit

本文链接:https://www.cnblogs.com/mangoubiubiu/p/15953001.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   KwFruit  阅读(45)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起