標準定義
接口隔離原則(Interface Segregation Principle, ISP) 定義如下:
不要強迫客戶依賴于它們不需要的方法掷倔,應用接口將兩者隔離
生活案例
《解憂雜貨店》是東野圭吾的一本小說柑营,小說描述了這樣的一件事情志笼。
三個小偷在慌亂之中躲進了一個雜貨店,他的主人是浪矢爺爺懊缺。雜貨店已經(jīng)很久沒有開門了袱巨,一切看起來都很陳舊的樣子铁坎,頗有上個世紀的感覺。值得一提的是箫爷,雜貨店還有一個信箱嚷节,這個信箱是浪矢爺爺和小朋友們溝通的橋梁,小朋友們會把他們的一些問題寫成書信投到這個信箱當中虎锚,然后浪矢爺爺會在每天晚上去看小朋友們投進來的信硫痰,認真思考之后給小朋友們一封回信。這么多年過去了窜护,浪矢爺爺也已乘黃鶴去效斑,自然沒有人回信,當然也沒有人寫信柱徙。但是這三個小偷缓屠,就在他們躲進雜貨店的這晚,卻莫名其妙收到了前來咨詢的信件护侮,因男友身患絕癥敌完,年輕女孩月兔在愛情與夢想間徘徊;松岡克郎為了音樂夢想離家漂泊羊初,卻在現(xiàn)實中寸步難行滨溉;少年浩介面臨家庭巨變,掙扎在親情與未來的迷茫中... .... 面對這些來著過去的信件长赞,站在未來的三個人晦攒,自然是開了上帝視角,給他們寫回信得哆,教他們什么去做脯颜,而過去的人,也因為遵循他們的建議柳恐,得到蠻不錯的結(jié)局伐脖。故事的最后热幔,三個小偷也收到了浪矢爺爺?shù)男偶虒麄兯媳樱孕乓锞蓿獮樽约旱奈磥砣紵?/p>
還是挺雞湯的。對于小偷躲進雜貨店那晚而言蠕啄,因為是站在未來給過去的回信场勤,三個人知道寫信人要經(jīng)歷怎么樣的社會變革,他們會很好地告知寫信人怎么去做歼跟,對于所有的問題和媳,由于站在上帝視角,雜貨店都能夠很好地回答哈街,而且不失偏差留瞳。而對于浪矢爺爺而言,他的回信就不是很好寫了骚秦,他不知道自己寫的東西能不能幫助到別人她倘,而且還有可能因為他的回信,對寫信人造成更大的困擾作箍。
浪矢爺爺?shù)睦_硬梁,更多的是策略上的問題。每個人都有每個人的煩惱胞得,有的為學習而煩惱荧止,有的為婚姻而煩惱,有的為工作而煩惱阶剑。不同的煩惱會有不同的解決辦法跃巡,并沒有一個統(tǒng)一的標準。加上浪矢爺爺并不像三個小偷一樣个扰,站在上帝的視角來看待這些問題瓷炮,所以,對于他來講递宅,解答別人的煩惱是一件很困難的事情娘香。
那么,該怎么做办龄?
我們假設(shè)浪矢爺爺是一個婦聯(lián)主任烘绽,有很好的解決家庭矛盾的技能,尤其擅長于解決婚姻問題俐填,對于保大還是保小安接,救老婆還是救老媽手到擒來,不在話下英融。那么盏檐,他在信箱上就可以貼上歇式,“專業(yè)解決婚姻煩惱”的告示。專業(yè)的人做專業(yè)的事情胡野,也比萬金油去解決所有的事情強得多材失。浪矢爺爺這時候,雖然并不是來著未來硫豆,但是憑借他專業(yè)的技術(shù)和知識儲備龙巨,相信他對解決婚姻困擾的問題上能夠勢如破竹。
接口隔離就是這么一回事熊响,一個接口是對調(diào)用方的承諾旨别,寫在接口上的方法調(diào)用方都可能去執(zhí)行。接口就像是浪矢爺爺?shù)男畔浜骨眩{(diào)用方就是寫信人秸弛,投信是調(diào)用接口,而回信就是返回結(jié)果剔难。浪矢爺爺面臨不能解答問題的困擾胆屿,是因為他承諾解決煩惱的領(lǐng)域太大,有些領(lǐng)域他并擅長偶宫,所以他也不能很好地去回答。接口也一樣环鲤,暴露出來就是要給別人調(diào)的纯趋,如果實現(xiàn)沒有寫好,就把接口暴露出來冷离,別人調(diào)的時候發(fā)現(xiàn)了問題吵冒,那怪責的只能是寫接口的人。
(十分抱歉西剥,我對這本小說做了這樣的解讀)
程序例子
具體的業(yè)務按照03. 單一功能原則來定義痹栖。
IPrinter有下面的方法,加墨水瞭空,加紙揪阿,打印。
interface IPrinter {
void addInk(Ink ink);
void addPaper(Paper paper);
void print()
}
現(xiàn)在的可以發(fā)展真快咆畏,我們的打印機不需要加墨水了南捂,他會在空氣中提取霧霾,然后通過牛逼的技術(shù)合成墨水旧找,addInk的方法就不需要溺健,但是,并不是每臺打印機都能采用這種牛逼的技術(shù)钮蛛,有些還是要加墨水的鞭缭。對于這一個改變剖膳,我們怎么在程序上體現(xiàn)呢?如果不根據(jù)接口隔離的原則岭辣,我們完全可以不改程序吱晒,打印機統(tǒng)一實現(xiàn)IPrinter接口就可以了,addInk在舊打印機上調(diào)用易结,在新的打印機上不調(diào)用枕荞,變成空的方法就行,但是搞动,要記住躏精,接口是對調(diào)用方的承諾,如果調(diào)用方在新的打印機上調(diào)用addInk方法鹦肿,并沒有任何的返回矗烛,也不做處理,這樣的代碼很容易出問題箩溃,調(diào)用方就會想瞭吃,我使用了新的打印機,我明明加了黑色的墨水涣旨,但是為什么打印出來的文檔還是紅色的歪架。顯然這是不可理喻的。
根據(jù)接口隔離原則霹陡,我們新舊兩種打印機的接口應該分開來寫和蚪,程序代碼如下:
public interface IPrinter{
void addPaper(Paper paper);
void print()
}
public interface IOldPrinter extends IPrinter{
void addInk(Ink ink);
}
對于新的打印機,我們實現(xiàn)IPrinter烹棉,對于舊的打印機攒霹,實現(xiàn)IOldPrinter,這樣做就能很好遵循接口隔離的原則了浆洗。