接口隔离原则有两种定义:
第一种定义: Clients should not be forced to depend upon interfaces that they don't use.
客户端不应该依赖它不需用的接口。
第二种定义:The dependency of one class to another one should depend on the smallest possible interface。类间的依赖关系应该建立在最小的接口上。
简单来说就是有两种车,普通汽车和电动车,普通汽车加油,电动车充电。
这个时候如果我们为两种车抽象一个接口ICar.在接口中定义加油和充电两种补给方法.
如图:
从图中看出,NormalCar其实是不需要charge方法的,但是因为实现了ICar接口,使得NormalCar不得不实现charge方法,即被迫实现了不需要的方法。
同理,ElectricCar也不需要refuel方法。
从中可以看出,该设计就是违反ISP的设计。
我们试着修改成如下UML:
普通车和电动车,各实现自己的接口。这样就不需要被迫实现对自己没用的方法了.
如果这个时候又来一种混动车,应该怎么处理呢?
只要分别实现汽油车接口和电动车接口就OK了.
如图:
代码如下:
/**
* 汽油车接口
* @author saisaimayi
*
*/
public interface IGasCar {
public void refuel();
}
/**
* 电动车接口
* @author saisaimayi
*
*/
public interface IElectricCar {
public void charge();
}
/**
* 普通车
* @author saisaimayi
*
*/
public class NormalCar implements IGasCar {
public void refuel() {
System.out.println("reruel for normal car...");
}
}
/**
* 电动车类
* @author saisaimayi
*
*/
public class ElectricCar implements IElectricCar {
public void charge() {
System.out.println("charge for Electric car...");
}
}
/**
* 混动车类
* @author saisaimayi
*
*/
public class HybridCar implements IGasCar, IElectricCar {
public void charge() {
System.out.println("charge for hybrid car...");
}
public void refuel() {
System.out.println("refuel for hybrid car...");
}
}