定义:
- 客户端不应该依赖它不需用的接口。
- 类间的依赖关系应该建立在最小的接口上。
解释定义:
我们可以把这两个定义概括为一句话:建立单一接口,不要建立臃肿庞大的接口。再通俗的一点讲: 接口尽量细化,同时接口中的方法尽量的少。
和单一职责不同的是,单一职责是按照职责划分接口的,并不完全不符合接口隔离原则。接口隔离原则就是再细化一下,比如一个接口有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. 提高内聚,减少对外交互。使接口用最少的方法去完成更多的事情。