接口隔離原則有兩種定義:
第一種定義: Clients should not be forced to depend upon interfaces that they don't use.
客戶端不應(yīng)該依賴它不需用的接口。
第二種定義:The dependency of one class to another one should depend on the smallest possible interface。類間的依賴關(guān)系應(yīng)該建立在最小的接口上。
簡(jiǎn)單來說就是有兩種車丽柿,普通汽車和電動(dòng)車,普通汽車加油,電動(dòng)車充電催束。
這個(gè)時(shí)候如果我們?yōu)閮煞N車抽象一個(gè)接口ICar.在接口中定義加油和充電兩種補(bǔ)給方法.
如圖:
image.png
從圖中看出,NormalCar其實(shí)是不需要charge方法的嘶摊,但是因?yàn)閷?shí)現(xiàn)了ICar接口延蟹,使得NormalCar不得不實(shí)現(xiàn)charge方法,即被迫實(shí)現(xiàn)了不需要的方法叶堆。
同理阱飘,ElectricCar也不需要refuel方法。
從中可以看出虱颗,該設(shè)計(jì)就是違反ISP的設(shè)計(jì)沥匈。
我們?cè)囍薷某扇缦耈ML:
image.png
普通車和電動(dòng)車,各實(shí)現(xiàn)自己的接口忘渔。這樣就不需要被迫實(shí)現(xiàn)對(duì)自己沒用的方法了.
如果這個(gè)時(shí)候又來一種混動(dòng)車,應(yīng)該怎么處理呢?
只要分別實(shí)現(xiàn)汽油車接口和電動(dòng)車接口就OK了.
如圖:
image.png
代碼如下:
/**
* 汽油車接口
* @author saisaimayi
*
*/
public interface IGasCar {
public void refuel();
}
/**
* 電動(dòng)車接口
* @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...");
}
}
/**
* 電動(dòng)車類
* @author saisaimayi
*
*/
public class ElectricCar implements IElectricCar {
public void charge() {
System.out.println("charge for Electric car...");
}
}
/**
* 混動(dòng)車類
* @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...");
}
}