ISP 接口隔離原則

Interface Segregation Principle

動(dòng)機(jī)

當(dāng)我們?cè)噲D去設(shè)計(jì)軟件應(yīng)用時(shí),我們要仔細(xì)思考如何去抽象一個(gè)包含多個(gè)子模塊的模塊塔鳍。假設(shè)模塊僅由一個(gè)類構(gòu)成,我們可以用一個(gè)接口來實(shí)現(xiàn)系統(tǒng)的抽象畜晰。不過汽纤,假如我們想擴(kuò)展我們的應(yīng)用,增加另一個(gè)模塊,而這個(gè)模塊只包含原系統(tǒng)的一部分子模塊肢础,那我們就被迫地去實(shí)現(xiàn)這整個(gè)接口还栓,然后編寫一些虛假的方法。這種接口我們稱為是胖接口 fat interface 或者被污染的接口传轰。擁有一個(gè)被污染的接口不是一個(gè)好的解決方案蝙云,而且可能給系統(tǒng)帶來不恰當(dāng)?shù)男袨椤?/p>

ISP 規(guī)定客戶端不應(yīng)被強(qiáng)迫實(shí)現(xiàn)他們不需要使用的接口。應(yīng)優(yōu)先選擇基于方法分組路召,分別服務(wù)各小模塊的小型接口,而不是一個(gè)大而全的胖接口波材。

目的

客戶端不應(yīng)被迫依賴他們不必使用的接口股淡。

例子

以下是一個(gè)違背 ISP 的例子。 我們有個(gè) Manager 類來管理工人廷区。還有2種類型的工人唯灵,一種工作效率達(dá)到平均水平,一種工作效率非常高隙轻。兩種類型的工人每天都需要午休時(shí)間吃飯埠帕。?現(xiàn)在一些機(jī)器人也進(jìn)入公司,但是這些機(jī)器人不需要吃東西也就不需要午休了玖绿。一方面 Robot 類需要實(shí)現(xiàn) IWorker 接口敛瓷,因?yàn)樗麄兇_實(shí)要干活。另一方面斑匪,它們不需要實(shí)現(xiàn) IWorker 接口呐籽,因?yàn)樗鼈儾恍枰詵|西。

這就是為什么在這種情形下 IWorker 被認(rèn)為是受污染的接口蚀瘸。

如果我們繼續(xù)保持現(xiàn)有設(shè)計(jì)狡蝶,新的 Robot 類就被迫要實(shí)現(xiàn) eat 方法了。我們也寫一個(gè)什么也不做的偽類(比如說每天1秒的午休)贮勃, 然后將給應(yīng)用帶來非預(yù)期的影響(比如說經(jīng)理們看到的午休報(bào)告會(huì)多于實(shí)際的人數(shù))贪惹。

根據(jù) ISP ,靈活的設(shè)計(jì)中不會(huì)存在被污染的類寂嘉。在以上這個(gè)情況奏瞬,接口 IWorker 應(yīng)拆成2個(gè)不同的小接口。

interface IWorker{
    public void work();
    public void eat();
}

class Worker implements IWorker{

    public void work() {
        // ... working
    }

    public void eat() {
       // ... eating in lunch break
    }
}

class SuperWorker implements IWorker{
    public void work() {
        // ... working much more
    }

    public void eat() {
       // ... eating in lunch break
    }
}

class Robot implements  IWorker{
    public void work() {
        // ... working
    }

    public void eat() {
        // ... Robot doesn't need eat !!!    被迫~~~~
    }
}

class Manager{
    IWorker worker;

    public void setWorker(IWorker w){
        this.worker = w;
    }

    public void manage(){
        this.worker.work();
    }
}

再下面是遵循 ISP 的例子垫释。通過將 IWorker 拆分成2個(gè)獨(dú)立的接口丝格,新 Robot 就不用再被迫實(shí)現(xiàn)這個(gè) eat 方法了。同樣棵譬,如果我們需要給機(jī)器人添加另一個(gè)功能显蝌,比如說,充電,我們只需要再建一個(gè) IRechargeble 接口曼尊,并在其中規(guī)定 recharge 方法就行酬诀。

interface IWorkable {
    public void work();
}

interface IFeedable {
    public void eat();
}

class Worker implements IWorkable, IFeedable {

    public void work() {
        // ... working
    }

    public void eat() {
        // ... eating in lunch break
    }
}

class SuperWorker implements IWorkable, IFeedable {

    public void work() {
        // ... working much more
    }

    public void eat() {
        // ... eating in lunch break
    }
}

class Robot implements IWorkable {

    public void work() {
        // ... working
    }
}

class Manager {
    IWorkable worker;

    public void setWorker(IWorkable w) {
        this.worker = w;
    }

    public void manage() {
        this.worker.work();
    }
}

總結(jié)

如果原有設(shè)計(jì)已經(jīng)完成,已有的胖接口可以通過適配器模式來進(jìn)行拆分骆撇。
就如其他原則一樣 ISP 也需要耗費(fèi)額外的時(shí)間和精力去應(yīng)用它瞒御,也會(huì)使代碼更加復(fù)雜。不過神郊,它也帶來更靈活的設(shè)計(jì)肴裙。如果在不必要的地方也去使用 ISP 的話,會(huì)導(dǎo)致一堆只有單個(gè)方法的接口涌乳。所以蜻懦,ISP 的應(yīng)用需要基于經(jīng)驗(yàn)和常識(shí)來識(shí)別在未來比較有可能需要擴(kuò)展的代碼區(qū)域。

上一篇: 依賴倒置原則
下一篇: 單一職責(zé)原則
目錄: http://www.reibang.com/p/af861220a6cc

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夕晓,一起剝皮案震驚了整個(gè)濱河市宛乃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒸辆,老刑警劉巖征炼,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異躬贡,居然都是意外死亡谆奥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門逗宜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雄右,“玉大人,你說我怎么就攤上這事纺讲±奕裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵熬甚,是天一觀的道長(zhǎng)逢渔。 經(jīng)常有香客問我,道長(zhǎng)乡括,這世上最難降的妖魔是什么肃廓? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诲泌,結(jié)果婚禮上盲赊,老公的妹妹穿的比我還像新娘。我一直安慰自己敷扫,他們只是感情好哀蘑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般绘迁。 火紅的嫁衣襯著肌膚如雪合溺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天缀台,我揣著相機(jī)與錄音棠赛,去河邊找鬼。 笑死膛腐,一個(gè)胖子當(dāng)著我的面吹牛睛约,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哲身,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痰腮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了律罢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤棍丐,失蹤者是張志新(化名)和其女友劉穎误辑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歌逢,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡巾钉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秘案。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰苍。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阱高,靈堂內(nèi)的尸體忽然破棺而出赚导,到底是詐尸還是另有隱情,我是刑警寧澤赤惊,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布吼旧,位于F島的核電站,受9級(jí)特大地震影響未舟,放射性物質(zhì)發(fā)生泄漏圈暗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一裕膀、第九天 我趴在偏房一處隱蔽的房頂上張望员串。 院中可真熱鬧,春花似錦昼扛、人聲如沸寸齐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽访忿。三九已至瞧栗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間海铆,已是汗流浹背迹恐。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卧斟,地道東北人殴边。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像珍语,于是被迫代替她去往敵國(guó)和親锤岸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容