1、定義
按照慣例,首先我們來看一下介面隔離原則的定義。
類間的依賴關係應該建立在最小的介面上。
介面中的方法應該儘量少,不要使介面過於臃腫,不要有很多不相關的邏輯方法。
有點類似於單一職責原則,都是功能儘可能的簡單單一,不要冗餘太多其他不相關的。
單一職責原則主要是類與方法,而介面隔離原則卻是對介面而言的。
2、場景
小廚洗菜,大廚做飯。
在番茄餐廳的後廚,老闆與求生欲極強的廚師長在聊天。
老闆:最近我們番茄餐廳廣受好評,菜品味道美味,這還得感謝你這位廚師長呀。
廚師長:應該的,這該感謝我。
老闆:嗯?你確定?
廚師長:還沒,還沒說完,這該感謝我…們的郝老闆,這次確定了。(冷汗)
老闆:你這求生欲厲害了,歎為觀止呀。不過現在隨著顧客的增多,人手再次不夠了,再招廚師肯定來不及了,你有什麼好辦法嗎?
廚師長:辦法我還真有一個,我們可以招點小廚,小廚要好招一些。
老闆:但小廚做飯不夠美味,很容易流失客戶的。
廚師長:小廚不做飯,小廚只負責洗菜。這樣呢,大廚就不用洗菜了,只負責做飯,這樣效率就上去了。
老闆:你是不是不想洗菜?
廚師長:當然不是,我就是,就是,就是替公司著想。
老闆:好吧,準了,招人吧。
3、程式碼
之前我們在依賴倒置原則聊過對介面程式設計,所以,首先我們定義一個廚師介面。
package com.fanqiekt.principle.segregation;
/**
* 廚師介面
*
* @author 番茄課堂-懶人
*/
public interface IChef {
/**
* 洗菜
*/
void wash();
/**
* 做飯
*/
void cooking();
}
複製程式碼
廚師做兩件事,一個是洗菜,一個是做菜。
接下來,我們寫一下大廚的程式碼,大廚實現了廚師介面。
大廚做飯,但不負責洗菜。
package com.fanqiekt.principle.segregation;
/**
* 大廚
*
* @author 番茄課堂-懶人
*/
public class BigChef implements IChef {
/**
* 洗菜的邏輯與大廚無關
*/
@Override
public void wash() {
}
@Override
public void cooking() {
System.out.println("大廚做飯");
}
}
複製程式碼
我們再寫一下小廚的部分,小廚也是實現廚師介面。
小廚不做飯,小廚只洗菜。
package com.fanqiekt.principle.segregation;
/**
* 小廚
*
* @author 番茄課堂-懶人
*/
public class Kitchen implements IChef {
@Override
public void wash() {
System.out.println("小廚洗菜");
}
/**
* 做飯的邏輯與小廚無關
*/
@Override
public void cooking() {
}
}
複製程式碼
這樣的寫法,好不好?
當然不好,每個類都冗餘了與他不相關的方法。例如,BigChef中的wash方法、Kitchen中的cooking方法。
這種現象是怎麼導致的呢?
介面不夠最小化。介面隔離原則就是為了解決這種問題的。
我們可以寫成兩個介面,一個是做飯的介面,一個是洗菜的介面。
package com.fanqiekt.principle.segregation;
/**
* 做飯介面
*
* @author 番茄課堂-懶人
*/
public interface ICook {
/**
* 做飯
*/
void cooking();
}
複製程式碼
做飯的介面。
package com.fanqiekt.principle.segregation;
/**
* 洗菜介面
*
* @author 番茄課堂-懶人
*/
public interface IWash {
/**
* 洗菜
*/
void wash();
}
複製程式碼
洗菜的介面。
我們再來看一下符合介面隔離原則的具體實現類。
package com.fanqiekt.principle.segregation;
/**
* 大廚
*
* @author 番茄課堂-懶人
*/
public class BigChef implements ICook{
/**
* 大廚只負責做飯,只處理和做飯相關的邏輯
*/
@Override
public void cooking() {
System.out.println("大廚做飯");
}
}
複製程式碼
這樣就沒有冗餘程式碼了。
package com.fanqiekt.principle.segregation;
/**
* 小廚
*
* @author 番茄課堂-懶人
*/
public class Kitchen implements IWash {
/**
* 小廚只負責洗菜,只處理和洗菜相關的邏輯
*/
@Override
public void wash() {
System.out.println("小廚洗菜");
}
}
複製程式碼
小廚同樣也沒有冗餘程式碼了。
這樣的寫法是不是更加的優雅了。
如果新增一種既洗菜又做飯的廚師型別,那同時實現ICook與IWash介面就可以了。
3、優點
它與單一職責原則類似,優點也是類似的。
降低風險
修改其中的一個業務,不會影響到業務。
易維護易擴充套件
沒有冗餘程式碼,符合介面隔離原則的介面,會更加容易擴充套件以及維護。
4、嘻哈說
接下來,請您欣賞介面隔離原則的原創歌曲。
嘻哈說:介面隔離原則
作曲:懶人
作詞:懶人
Rapper:懶人
奮鬥了多年總算熬成了大廚才不要關心洗菜
這些瑣事都摘不掉
剛入行一兩年但兢兢業業的小廚還不到烹飪大菜
因為這些來不了
所以介面功能太多在胡鬧
介面功能應該儘可能最少
這就是介面隔離
核心思想就是介面最小
這樣才結構得體
風險降低易擴充套件維護也有格局
用起來它是絕對合理
複製程式碼
閒來無事聽聽曲,知識已填腦中去;
學習複習新方式,頭戴耳機不小覷。
番茄課堂,學習也要酷。