面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則

接口隔離原則定義如下:

接口隔離原則(Interface Segregation Principle, ISP):使用多個(gè)專門的接口启盛,而不使用單一的總接口侄榴,即客戶端不應(yīng)該依賴那些它不需要的接口。

根據(jù)接口隔離原則孝冒,當(dāng)一個(gè)接口太大時(shí)啤挎,我們需要將它分割成一些更細(xì)小的接口,使用該接口的客戶端僅需知道與之相關(guān)的方法即可票罐。

每一個(gè)接口應(yīng)該承擔(dān)一種相對獨(dú)立的角色,不干不該干的事泞边,該干的事都要干该押。

這里的“接口”往往有兩種不同的含義:
一種是指一個(gè)類型所具有的方法特征的集合,僅僅是一種邏輯上的抽象阵谚;
另外一種是指某種語言具體的“接口”定義蚕礼,有嚴(yán)格的定義和結(jié)構(gòu),比如Java語言中的interface梢什。
對于這兩種不同的含義奠蹬,ISP的表達(dá)方式以及含義都有所不同:

(1) 當(dāng)把“接口”理解成一個(gè)類型所提供的所有方法特征的集合的時(shí)候,這就是一種邏輯上的概念嗡午,接口的劃分將直接帶來類型的劃分囤躁。可以把接口理解成角色荔睹,一個(gè)接口只能代表一個(gè)角色狸演,每個(gè)角色都有它特定的一個(gè)接口,此時(shí)应媚,這個(gè)原則可以叫做“角色隔離原則”严沥。

(2) 如果把“接口”理解成狹義的特定語言的接口猜极,那么ISP表達(dá)的意思是指接口僅僅提供客戶端需要的行為中姜,客戶端不需要的行為則隱藏起來,應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口跟伏,而不要提供大的總接口丢胚。在面向?qū)ο缶幊陶Z言中,實(shí)現(xiàn)一個(gè)接口就需要實(shí)現(xiàn)該接口中定義的所有方法受扳,因此大的總接口使用起來不一定很方便携龟,為了使接口的職責(zé)單一,需要將大接口中的方法根據(jù)其職責(zé)不同分別放在不同的小接口中勘高,以確保每個(gè)接口使用起來都較為方便峡蟋,并都承擔(dān)某一單一角色坟桅。接口應(yīng)該盡量細(xì)化,同時(shí)接口中的方法應(yīng)該盡量少蕊蝗,每個(gè)接口中只包含一個(gè)客戶端(如子模塊或業(yè)務(wù)邏輯類)所需的方法即可仅乓,這種機(jī)制也稱為“定制服務(wù)”,即為不同的客戶端提供寬窄不同的接口蓬戚。

下面通過一個(gè)簡單實(shí)例來加深對接口隔離原則的理解:

Sunny軟件公司開發(fā)人員針對某CRM系統(tǒng)的客戶數(shù)據(jù)顯示模塊設(shè)計(jì)了如圖1所示接口夸楣,其中方法dataRead()用于從文件中讀取數(shù)據(jù),方法transformToXML()用于將數(shù)據(jù)轉(zhuǎn)換成XML格式子漩,方法createChart()用于創(chuàng)建圖表豫喧,方法displayChart()用于顯示圖表,方法createReport()用于創(chuàng)建文字報(bào)表幢泼,方法displayReport()用于顯示文字報(bào)表紧显。

圖1 初始設(shè)計(jì)方案結(jié)構(gòu)圖.png

在實(shí)際使用過程中發(fā)現(xiàn)該接口很不靈活,例如如果一個(gè)具體的數(shù)據(jù)顯示類無須進(jìn)行數(shù)據(jù)轉(zhuǎn)換(源文件本身就是XML格式)缕棵,但由于實(shí)現(xiàn)了該接口鸟妙,將不得不實(shí)現(xiàn)其中聲明的transformToXML()方法(至少需要提供一個(gè)空實(shí)現(xiàn));如果需要?jiǎng)?chuàng)建和顯示圖表挥吵,除了需實(shí)現(xiàn)與圖表相關(guān)的方法外重父,還需要實(shí)現(xiàn)創(chuàng)建和顯示文字報(bào)表的方法,否則程序編譯時(shí)將報(bào)錯(cuò)忽匈。

現(xiàn)使用接口隔離原則對其進(jìn)行重構(gòu)房午。

在圖1中,由于在接口CustomerDataDisplay中定義了太多方法丹允,即該接口承擔(dān)了太多職責(zé)郭厌,一方面導(dǎo)致該接口的實(shí)現(xiàn)類很龐大,在不同的實(shí)現(xiàn)類中都不得不實(shí)現(xiàn)接口中定義的所有方法雕蔽,靈活性較差折柠,如果出現(xiàn)大量的空方法,將導(dǎo)致系統(tǒng)中產(chǎn)生大量的無用代碼批狐,影響代碼質(zhì)量扇售;另一方面由于客戶端針對大接口編程,將在一定程序上破壞程序的封裝性嚣艇,客戶端看到了不應(yīng)該看到的方法承冰,沒有為客戶端定制接口。因此需要將該接口按照接口隔離原則和單一職責(zé)原則進(jìn)行重構(gòu)食零,將其中的一些方法封裝在不同的小接口中困乒,確保每一個(gè)接口使用起來都較為方便,并都承擔(dān)某一單一角色贰谣,每個(gè)接口中只包含一個(gè)客戶端(如模塊或類)所需的方法即可娜搂。

通過使用接口隔離原則迁霎,本實(shí)例重構(gòu)后的結(jié)構(gòu)如圖2所示:

圖2 重構(gòu)后的結(jié)構(gòu)圖.png

在使用接口隔離原則時(shí),我們需要注意控制接口的粒度百宇,接口不能太小欧引,如果太小會(huì)導(dǎo)致系統(tǒng)中接口泛濫,不利于維護(hù)恳谎;接口也不能太大芝此,太大的接口將違背接口隔離原則,靈活性較差因痛,使用起來很不方便婚苹。
一般而言,接口中僅包含為某一類用戶定制的方法即可鸵膏,不應(yīng)該強(qiáng)迫客戶依賴于那些它們不用的方法膊升。

文章轉(zhuǎn)載自 —— 面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谭企,隨后出現(xiàn)的幾起案子廓译,更是在濱河造成了極大的恐慌,老刑警劉巖债查,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非区,死亡現(xiàn)場離奇詭異,居然都是意外死亡盹廷,警方通過查閱死者的電腦和手機(jī)征绸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俄占,“玉大人管怠,你說我怎么就攤上這事「组” “怎么了渤弛?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甚带。 經(jīng)常有香客問我她肯,道長,這世上最難降的妖魔是什么欲低? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任辕宏,我火速辦了婚禮畜晰,結(jié)果婚禮上砾莱,老公的妹妹穿的比我還像新娘。我一直安慰自己凄鼻,他們只是感情好腊瑟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布聚假。 她就那樣靜靜地躺著,像睡著了一般闰非。 火紅的嫁衣襯著肌膚如雪膘格。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天财松,我揣著相機(jī)與錄音瘪贱,去河邊找鬼。 笑死辆毡,一個(gè)胖子當(dāng)著我的面吹牛菜秦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舶掖,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼球昨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了眨攘?” 一聲冷哼從身側(cè)響起主慰,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲫售,沒想到半個(gè)月后共螺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡情竹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年璃谨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲤妥。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佳吞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出棉安,到底是詐尸還是另有隱情底扳,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布贡耽,位于F島的核電站衷模,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒲赂。R本人自食惡果不足惜阱冶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望滥嘴。 院中可真熱鬧木蹬,春花似錦、人聲如沸若皱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晦譬,卻和暖如春疤苹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敛腌。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工卧土, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人像樊。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓夸溶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凶硅。 傳聞我的和親對象是個(gè)殘疾皇子缝裁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359