参考慕课网视频《Java设计模式精讲》:
视频作者:Geely
视频链接:https://coding.imooc.com/lesson/270.html#mid=17152
定义
用多个专门的接口,而不使用单一的总接口。客户端不应该依赖它不需要的接口。
强调
- 一个类对一个类的依赖应该建立在最小的接口上。
- 建立单一接口,不要建立庞大臃肿的接口。
- 尽量细化接口,接口中的方法尽量少。
优点
符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性。
代码实现
还是先以反例来说明,看一个违背接口隔离原则的设计。
public interface Animal {
/**
* 吃东西
*/
void eat();
/**
* 游泳
*/
void swim();
/**
* 飞
*/
void fly();
}
定义了一个动物的接口,接下来写实现类。
public class SmallDog implements Animal {
@Override
public void eat() {
System.out.println("小狗会吃东西");
}
@Override
public void swim() {
System.out.println("小狗会游泳");
}
@Override
public void fly() {
}
}
public class SmallBird implements Animal {
@Override
public void eat() {
System.out.println("小鸟会吃东西");
}
@Override
public void swim() {
}
@Override
public void fly() {
System.out.println("小鸟会飞");
}
}
可以仔细看上面的代码,小狗实现了动物这个类,实现了里面的方法,但是呢。有一个空方法,这是小狗不需要实现的。不可能强迫人家小狗飞到天上吧?
小鸟的实现类和小狗一样,难道让小鸟跑到水里游泳去吗?这也太难为人家了。这就是接口设计的过于臃肿,只要接口中出现的方法,不管对依赖于它的类有没有用处,实现类中都必须去实现这些方法。
所以,为了避免这样的情况发生,就要根据接口隔离原则,将接口抽离出来,使用多个统一的接口。
遵循接口隔离原则,重新实现上面的代码。首先定义一个吃东西的接口
public interface IEatAbility {
/**
* 吃饭的功能
*/
void eat();
}
接着定义一个游泳的接口
public interface ISwimAbility {
/**
* 游泳的功能
*/
void swim();
}
最后定义飞的接口
public interface IFlyAbility {
/**
* 飞
*/
void fly();
}
小狗只会吃东西和游泳,所以只用实现吃、游泳的接口。
public class Dog implements IEatAbility, ISwimAbility {
@Override
public void eat() {
System.out.println("小狗会吃东西");
}
@Override
public void swim() {
System.out.println("小狗会游泳");
}
}
小鸟只会吃东西和飞,所以只用实现吃、飞的接口。
public class Bird implements IEatAbility, IFlyAbility {
@Override
public void eat() {
System.out.println("小鸟会吃东西");
}
@Override
public void fly() {
System.out.println("小鸟会飞");
}
}
基本上接口隔离原则就完成了,这个原则相对简单。但是在接口设计的时候也要注意,接口设计尽量小,但是一定要适度。设计的过小,会使系统复杂度增加,不利于维护。
成就一番伟业的唯一途径就是热爱自己的事业。如果你还没能找到让自己热爱的事业,继续寻找,不要放弃。跟随自己的心,总有一天你会找到的。