设计原则(二)接口隔离

接口隔离原则有两种定义:

第一种定义: 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.在接口中定义加油和充电两种补给方法.
如图:


image.png

从图中看出,NormalCar其实是不需要charge方法的,但是因为实现了ICar接口,使得NormalCar不得不实现charge方法,即被迫实现了不需要的方法。
同理,ElectricCar也不需要refuel方法。
从中可以看出,该设计就是违反ISP的设计。
我们试着修改成如下UML:


image.png

普通车和电动车,各实现自己的接口。这样就不需要被迫实现对自己没用的方法了.
如果这个时候又来一种混动车,应该怎么处理呢?
只要分别实现汽油车接口和电动车接口就OK了.
如图:
image.png

代码如下:

/**
 * 汽油车接口
 * @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...");

    }

}

你可能感兴趣的:(设计原则(二)接口隔离)