1、什么是接口隔离原则?
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
- 使用多个专门的接口比使用单一的总接口要好。
- 一个类对另外一个类的依赖性应当是建立在最小的接口上的。
- 一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
2、示例
反例:
现在有一个借口Animal,里边有eat,fly,swim三个方法,现在新建三个类,bird,dog,fish,这样,鱼就可以游泳,鸟可以飞,狗狗和鸟以及鱼都可以吃。代码如下:
/**
* 项目名称:OpenCloseRole
* 类 名 称:Animal
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:36
* 创 建 人:wteng
*/
public interface Animal {
void eat();
void fly();
void swim();
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Bird
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:40
* 创 建 人:wteng
*/
public class Bird implements Animal {
@Override
public void eat() {
System.out.println("鸟吃虫子");
}
@Override
public void fly() {
System.out.println("我飞!!!");
}
@Override
public void swim() {
System.out.println("不能游泳^ ^");
}
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Dog
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:37
* 创 建 人:wteng
*/
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("狗啃骨头");
}
@Override
public void fly() {
throw new UnsupportedOperationException("Tell me how???");
}
@Override
public void swim() {
System.out.println("狗刨");
}
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Fish
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:39
* 创 建 人:wteng
*/
public class Fish implements Animal {
@Override
public void eat() {
System.out.println("大鱼吃小鱼,小鱼吃虾米");
}
@Override
public void fly() {
}
@Override
public void swim() {
}
}
那么问题也是比较明显的,狗狗不会飞,鸟儿不会游泳,鱼不会飞,但是这三个类都实现了Animal接口,三个类中多出的方法,就显得有点多余了,不应该依赖它不需要的功能,还造成了接口的污染。
所谓接口污染
就是为接口添加不必要的职责,如果开发人员在接口中增加一个新功能的目的只是减少接口实现类的数目,则此设计将导致接口被不断地“污染”并“变胖”。
正例
/**
* 项目名称:OpenCloseRole
* 类 名 称:Animal
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:56
* 创 建 人:wteng
*/
public interface Animal {
void eat();
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Flyable
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:57
* 创 建 人:wteng
*/
public interface Flyable {
void fly();
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Swimable
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:57
* 创 建 人:wteng
*/
public interface Swimable {
void swim();
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Bird
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:58
* 创 建 人:wteng
*/
public class Bird implements Animal, Flyable {
@Override
public void eat() {
}
@Override
public void fly() {
}
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Dog
* 类 描 述:TODO
* 创建时间:2021/1/5 上午10:58
* 创 建 人:wteng
*/
public class Dog implements Animal, Swimable {
@Override
public void eat() {
}
@Override
public void swim() {
}
}
/**
* 项目名称:OpenCloseRole
* 类 名 称:Fish
* 类 描 述:TODO
* 创建时间:2021/1/6 上午10:23
* 创 建 人:wteng
*/
public class Fish implements Animal, Swimable {
@Override
public void eat() {
}
@Override
public void swim() {
}
}
按照新设计的结构来,Animal接口提取共性吃的特征,而游泳和飞翔写成独立的接口,这时候只需要实现动物独有的特征接口即可,也不会造成接口臃肿。