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

接口隔离原则

基本介绍

客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。
接口Interface1中有5个方法,
类A需要通过接口Interface1去掉用B类的第1,2,3个方法,
类C需要通过接口Interface1去调用D类的第1,4,5个方法,
这个时候B,D两个类必须重写完Interface1中的所有方法,这样会重写一些并没有使用的方法。
按照隔离原则,Interface1应该拆分成几个更小的独立的接口,供A类和C类使用。

问题代码示例

/**
 * 接口Interface1有5个方法
 */	
interface Interface1 {
    void operation1();

    void operation2();

    void operation3();

    void operation4();

    void operation5();
}

/**
 * B类实现了Interface1的所有方法
 */
class B implements Interface1 {

    @Override
    public void operation1() {
        System.out.println("B实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("B实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("B实现了 operation3");
    }

    @Override
    public void operation4() {
        System.out.println("B实现了 operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现了 operation5");
    }
}

/**
 * D类实现了Interface1中的所有方法
 */
class D implements Interface1 {

    @Override
    public void operation1() {
        System.out.println("D实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D实现了 operation3");
    }

    @Override
    public void operation4() {
        System.out.println("D实现了 operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现了 operation5");
    }
}

/**
 * A类通过接口Interface1去使用B类
 * 但是只会用到B类方法1,2,3,从这里可以看出来B类白重写了未使用的方法
 */
class A {
    // 注意这里是利用Interface1去调用B类的方法,因为B类是Interface1的子类
    // 因为Interface1不是最小接口,所以造成了重写了很多没有用的方法
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend2(Interface1 i) {
        i.operation2();
    }

    public void depend3(Interface1 i) {
        i.operation3();
    }
}

/**
 * C类通过接口Interface1去使用D类
 * 但是只会用到D类方法1,4,5,从这里可以看出来D类白重写了未使用的方法
 */
class C {
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend4(Interface1 i) {
        i.operation4();
    }

    public void depend5(Interface1 i) {
        i.operation5();
    }
}

使用接口隔离分离出最小依赖接口

/**
 * 这里我们将原来的Interface1中的5个方法分别提取出最小接口
 */
interface Interface1 {
    void operation1();
}

interface Interface2 {
    void operation2();

    void operation3();
}

interface Interface3 {
    void operation4();

    void operation5();
}

/**
 * 采用多实现方式,实现接口隔离原则
 */
class B implements Interface1,Interface3{

    @Override
    public void operation1() {
        System.out.println("B实现了 operation1");
    }

    @Override
    public void operation4() {
        System.out.println("B实现了 operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现了 operation5");
    }
}

/**
 * 采用了接口隔离方式,只需要重写需要的方法
 */
class D implements Interface1,Interface2{

    @Override
    public void operation1() {
        System.out.println("D实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D实现了 operation2");
    }
}
/**
 * A类通过接口Interface1去使用D类
 * 但是只会用到D类方法1,2,3
 */
class A {
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend2(Interface2 i) {
        i.operation2();
    }

    public void depend3(Interface2 i) {
        i.operation3();
    }
}

/**
 * C类通过接口Interface1去使用B类
 * 但是只会用到B类方法1,4,5
 */
class C {
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend4(Interface3 i) {
        i.operation4();
    }

    public void depend5(Interface3 i) {
        i.operation5();
    }
}

按照接口隔离模式优化后的代码

/**
 * 按照接口隔离原则优化代码
 */
public class Segregation1 {
    public static void main(String[] args) {
        // a通过Interface1,和Interface3去调用D类的1,2,3方法
        A a = new A();
        a.depend1(new D());
        a.depend2(new D());
        a.depend3(new D());

        // c通过Interface1,和Interface2去调用B类的1,4,5方法
        C c =new C();
        c.depend1(new B());
        c.depend4(new B());
        c.depend5(new B());
        
    }
}

/**
 * 这里我们将原来的Interface1中的5个方法分别提取出最小接口
 */
interface Interface1 {
    void operation1();
}

interface Interface2 {
    void operation2();

    void operation3();
}

interface Interface3 {
    void operation4();

    void operation5();
}

/**
 * 采用多实现方式,实现接口隔离原则
 */
class B implements Interface1,Interface3{

    @Override
    public void operation1() {
        System.out.println("B实现了 operation1");
    }

    @Override
    public void operation4() {
        System.out.println("B实现了 operation4");
    }

    @Override
    public void operation5() {
        System.out.println("B实现了 operation5");
    }
}

/**
 * 采用了接口隔离方式,只需要重写需要的方法
 */
class D implements Interface1,Interface2{

    @Override
    public void operation1() {
        System.out.println("D实现了 operation1");
    }

    @Override
    public void operation2() {
        System.out.println("D实现了 operation2");
    }

    @Override
    public void operation3() {
        System.out.println("D实现了 operation2");
    }
}
/**
 * A类通过接口Interface1去使用D类
 * 但是只会用到D类方法1,2,3
 */
class A {
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend2(Interface2 i) {
        i.operation2();
    }

    public void depend3(Interface2 i) {
        i.operation3();
    }
}

/**
 - C类通过接口Interface1去使用B类
 - 但是只会用到B类方法1,4,5
 */
class C {
    public void depend1(Interface1 i) {
        i.operation1();
    }

    public void depend4(Interface3 i) {
        i.operation4();
    }

    public void depend5(Interface3 i) {
        i.operation5();
    }
}

总结

  • 主要是根据方法调用之间的关系,把一些接口再次分离出来更小的接口,尽量把用不到的方法拆分开,说白了就是拆接口,不然会出现根本不会使用的方法却还必须在实现类重写
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值