接口隔离原则

定义:

  1. 客户端不应该依赖它不需用的接口。
  2. 类间的依赖关系应该建立在最小的接口上。

解释定义:
我们可以把这两个定义概括为一句话:建立单一接口,不要建立臃肿庞大的接口。再通俗的一点讲: 接口尽量细化,同时接口中的方法尽量的少。

和单一职责不同的是,单一职责是按照职责划分接口的,并不完全不符合接口隔离原则。接口隔离原则就是再细化一下,比如一个接口有1,2,3,但是我只想要1,2,这个时候就要拆分成两个接口,1,2和3,这就是接口隔离原则。

举例:

比如有个一猪场,生产猪蹄,猪头和猪耳朵,我们把这三种定义一个接口:
图解:
在这里插入图片描述
代码实现:

public interface PigFactory {
    void pigHead();
    void pigFoot();
    void pigEar();
}

然后实现他们:

public class PigFactorImpl implements PigFactory {
    @Override
    public void pigHead() {
        System.out.println("来了,猪头");
    }

    @Override
    public void pigFoot() {
        System.out.println("来了,猪蹄");
    }

    @Override
    public void pigEar() {
        System.out.println("来了,猪耳朵");
    }
}

写一个买猪肉的接口

public interface BuyPig {
    void buy(PigFactory pigFactory);
}

实现它:

public class BuyPigImpl implements BuyPig{
    @Override
    public void buy(PigFactory pigFactory) {
        pigFactory.pigEar();
        pigFactory.pigFoot();
        pigFactory.pigHead();
    }
}

场景,朱老六来买猪肉了:

public class Client {
    public static void main(String[] args) {
        BuyPig buyPig = new BuyPigImpl();
        PigFactory pigFactory = new PigFactorImpl();
        buyPig.buy(pigFactory);
    }
}

问题来了,朱老六只想买拌菜(拌猪头肉,拌猪耳朵),但是买就只能买都买,不卖散装的,这可怎么办,所以就需要接口隔离了:
图解:
在这里插入图片描述
代码:
首先,把猪场接口拆分掉,拆成PigFactory 和PigCoolFactory :

public interface PigFactory {
    void pigFoot();
}

public interface PigCoolFactory {
    void pigHead();
    void pigEar();
}

然后实现成两个接口:

public class PigFactorImpl implements PigFactory,PigCoolFactory {
    @Override
    public void pigHead() {
        System.out.println("来了,猪头");
    }

    @Override
    public void pigFoot() {
        System.out.println("来了,猪蹄");
    }

    @Override
    public void pigEar() {
        System.out.println("来了,猪耳朵");
    }
}

修改买猪人的接口:

public interface BuyPig {
    void buy(PigFactory pigFactory);
    void buyCool(PigCoolFactory pigCoolFactory);
}

修改实现

public class BuyPigImpl implements BuyPig{
    @Override
    public void buy(PigFactory pigFactory) {
        pigFactory.pigFoot();
    }

    @Override
    public void buyCool(PigCoolFactory pigCoolFactory) {
        pigCoolFactory.pigEar();
        pigCoolFactory.pigHead();
    }

}

这次朱老六就能买凉拌菜了:


public class Client {
    public static void main(String[] args) {
        BuyPig buyPig = new BuyPigImpl();
//        PigFactory pigFactory = new PigFactorImpl();
        PigCoolFactory pigCoolFactory = new PigFactorImpl();
        buyPig.buyCool(pigCoolFactory);
    }
}

在这里插入图片描述
原则:
为各个类建立专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用,因为这样会出现有些类并不需要
去实现的方法。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活
性和可维护性。

注意:
1. 接口尽量小,但是要有限度。如果接口过于小,则会造成接口数量过多的问题,使设计复杂化;接口也不能太大,
那就违背了接口隔离原则。所以一定要适度。
2. 只有专注地为一个类提供定制服务,才能建立最小的依赖关系;
3. 提高内聚,减少对外交互。使接口用最少的方法去完成更多的事情。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值