设计模式七大原则之接口隔离原则

设计模式七大原则之接口隔离原则(Interface Segeration Principle)

1.接口隔离原则介绍

一个类对另一个类的依赖应该建立在最小的接口上,如果建立在不是最小的接口上,则要实现不需要的方法违背接口隔离原则。

2.案例分析

场景: interface1是一个接口,有五个方法,C和D分别实现了interface1接口,A通过interface1对C产生依赖,但只需要用到function1,function2,function3三个方法,B通过interface1对C产生依赖,但只需要用到function1,function4,function5三个方法

传统解决方法:
只有一个接口,类图如下:
在这里插入图片描述
代码实现:

package com.ldx.segera;

public class Segeration {
    public static void main(String[] args) {
        A a = new A();
        C c = new C();
        a.function1(c);
        a.function2(c);
        a.function3(c);

        B b = new B();
        D d = new D();
        b.function1(d);
        b.function4(d);
        b.function5(d);
    }
}

interface interface1 {
    void function1();

    void function2();

    void function3();

    void function4();

    void function5();
}

class C implements interface1 {
    @Override
    public void function1() {
        System.out.println("C 中实现了 方法1");
    }

    @Override
    public void function2() {
        System.out.println("C 中实现了 方法2");
    }

    @Override
    public void function3() {
        System.out.println("C 中实现了 方法3");
    }

    @Override
    public void function4() {
        System.out.println("C 中实现了 方法4");
    }

    @Override
    public void function5() {
        System.out.println("C 中实现了 方法5");
    }
}

class D implements interface1 {
    @Override
    public void function1() {
        System.out.println("D 中实现了 方法1");
    }

    @Override
    public void function2() {
        System.out.println("D 中实现了 方法2");
    }

    @Override
    public void function3() {
        System.out.println("D 中实现了 方法3");
    }

    @Override
    public void function4() {
        System.out.println("D 中实现了 方法4");
    }

    @Override
    public void function5() {
        System.out.println("D 中实现了 方法5");
    }
}

class A {
    public void function1(interface1 i) {
        i.function1();
    }

    public void function2(interface1 i) {
        i.function2();
    }

    public void function3(interface1 i) {
        i.function3();
    }
}

class B {
    public void function1(interface1 i) {
        i.function1();
    }

    public void function4(interface1 i) {
        i.function4();
    }

    public void function5(interface1 i) {
        i.function5();
    }
}

运行结果:
在这里插入图片描述
运行结果是没有问题的,也解决了场景需求,但是类C和D却实现了不需要的其他两个方法。这就相对于一个工厂个人,他本来只需要负责搬货,但是你还要强制他去当客服,这显然是不合理的。

解决方法:接口隔离
将interface1分解成三个接口interface1(负责function1),interface2(负责function2,function3),interface3(负责function4,function5),C分别实现了interface1和interface2,D分别实现了interface1和interface3,A通过对interface1和interface2的依赖对C产生依赖,B通过对interface1和interface3的依赖对D产生依赖,类图如下:
在这里插入图片描述
代码实现:

package com.ldx.segera.com.ldx.segeration;

public class Segeration {
    public static void main(String[] args) {
        A a = new A();
        C c = new C();
        a.function1(c);
        a.function2(c);
        a.function3(c);

        B b = new B();
        D d = new D();
        b.function1(d);
        b.function4(d);
        b.function5(d);
    }
}

interface interface1 {
    void function1();
}

interface interface2 {

    void function2();

    void function3();

}

interface interface3 {

    void function4();

    void function5();
}

class C implements interface1, interface2 {
    @Override
    public void function1() {
        System.out.println("C 中实现了 方法1");
    }

    @Override
    public void function2() {
        System.out.println("C 中实现了 方法2");
    }

    @Override
    public void function3() {
        System.out.println("C 中实现了 方法3");
    }
}

class D implements interface1, interface3 {
    @Override
    public void function1() {
        System.out.println("D 中实现了 方法1");
    }

    @Override
    public void function4() {
        System.out.println("D 中实现了 方法4");
    }

    @Override
    public void function5() {
        System.out.println("D 中实现了 方法5");
    }
}

class A {
    public void function1(interface1 i) {
        i.function1();
    }

    public void function2(interface2 i) {
        i.function2();
    }

    public void function3(interface2 i) {
        i.function3();
    }
}

class B {
    public void function1(interface1 i) {
        i.function1();
    }

    public void function4(interface3 i) {
        i.function4();
    }

    public void function5(interface3 i) {
        i.function5();
    }
}

运行结果:
在这里插入图片描述
小结
接口隔离原则要求一个类对另一个类的依赖要建立在最小接口上,否则会承担不需要的职责。
七大设计原则汇总:七大设计原则汇总

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值