定义:用多个专门的接口,而不使用单一的总接口,客户端不应该依赖它不需要的接口。
一类对一个类的依赖应该建立在最小的接口上。
建立单一接口,不要建立庞大臃肿的接口。
尽量细化接口,接口中的方法尽量少。注意适度原则,一定要适度。
优点:符合我们常说的高内聚低耦合的设计思想,从而使类具有很好的可读性、可扩展性和可维护性。
案例:
我们以动物的行为为例,V1版本代码如下
最顶层的aniamlAction接口,定义了动物的几个行为,吃、飞、游泳等
public interface IAnimalAction { void eat(); void fly(); void swim(); }
两个具体的实现,鸟和狗
public class Bird implements IAnimalAction { @Override public void eat() { } @Override public void fly() { } @Override public void swim() { } }
public class Dog implements IAnimalAction { @Override public void eat() { } @Override public void fly() { } @Override public void swim() { } }
很明显, 狗是没法飞的,鸟也是没法游泳的,所以aniamlAction这个接口是可以进一步细化的,细化出飞行动物的行为和别的动物的行为的。
所以V1版本是不符合接口隔离原则的,我们进行改造,通过细化出多个小接口,实现类通过实现多个小接口来组合出想要的接口,V2版本的代码如下,
public interface IEatAnimalAction { void eat(); }
public interface ISwimAnimalAction { void swim(); }
public interface IFlyAnimalAction { void fly(); }
public class Bird implements IFlyAnimalAction, IEatAnimalAction { @Override public void eat() { } @Override public void fly() { } }
public class Dog implements ISwimAnimalAction,IEatAnimalAction { @Override public void eat() { } @Override public void swim() { } }
通过上述改造,我们的接口粒度更小了,接口之间也进行了隔离,可以通过组合的方式更加灵活的实现业务需要。
单一职责和接口隔离的区别:单一职责原则强调的是类、接口、方法的职责单一,针对的是程序中实现和细节,强调的是职责,接口隔离原则强调的是对接口依赖的隔离,针对抽象,程序框架的构建。
在日常开发中需要注意,接口尽量小没有问题,但是不能太小,一定要适度,否则会出现类爆炸的情况,设计也会更复杂。