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

面向?qū)ο笤O(shè)計(jì)原則除了開閉原則里氏替換原則闽寡、依賴倒置原則單一職責(zé)原則以外帮碰,還有接口隔離原則相味、迪米特法則和合成復(fù)用原則。本節(jié)將詳細(xì)介紹接口隔離原則殉挽。

接口隔離原則的定義

接口隔離原則(Interface Segregation Principle丰涉,ISP)要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法此再。

2002 年羅伯特·C.馬丁給“接口隔離原則”的定義是:客戶端不應(yīng)該被迫依賴于它不使用的方法(Clients should not be forced to depend on methods they do not use)昔搂。該原則還有另外一個(gè)定義:一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)。

以上兩個(gè)定義的含義是:要為各個(gè)類建立它們需要的專用接口输拇,而不要試圖去建立一個(gè)很龐大的接口供所有依賴它的類去調(diào)用摘符。

接口隔離原則和單一職責(zé)都是為了提高類的內(nèi)聚性、降低它們之間的耦合性策吠,體現(xiàn)了封裝的思想逛裤,但兩者是不同的:

  • 單一職責(zé)原則注重的是職責(zé),而接口隔離原則注重的是對(duì)接口依賴的隔離猴抹。
  • 單一職責(zé)原則主要是約束類带族,它針對(duì)的是程序中的實(shí)現(xiàn)和細(xì)節(jié);接口隔離原則主要約束接口蟀给,主要針對(duì)抽象和程序整體框架的構(gòu)建蝙砌。

接口隔離原則的優(yōu)點(diǎn)

接口隔離原則是為了約束接口、降低類對(duì)接口的依賴性跋理,遵循接口隔離原則有以下 5 個(gè)優(yōu)點(diǎn)择克。

  1. 將臃腫龐大的接口分解為多個(gè)粒度小的接口,可以預(yù)防外來(lái)變更的擴(kuò)散前普,提高系統(tǒng)的靈活性和可維護(hù)性肚邢。
  2. 接口隔離提高了系統(tǒng)的內(nèi)聚性,減少了對(duì)外交互拭卿,降低了系統(tǒng)的耦合性骡湖。
  3. 如果接口的粒度大小定義合理,能夠保證系統(tǒng)的穩(wěn)定性峻厚;但是响蕴,如果定義過(guò)小,則會(huì)造成接口數(shù)量過(guò)多惠桃,使設(shè)計(jì)復(fù)雜化浦夷;如果定義太大懊渡,靈活性降低,無(wú)法提供定制服務(wù)军拟,給整體項(xiàng)目帶來(lái)無(wú)法預(yù)料的風(fēng)險(xiǎn)。
  4. 使用多個(gè)專門的接口還能夠體現(xiàn)對(duì)象的層次誓禁,因?yàn)榭梢酝ㄟ^(guò)接口的繼承懈息,實(shí)現(xiàn)對(duì)總接口的定義。
  5. 能減少項(xiàng)目工程中的代碼冗余摹恰。過(guò)大的大接口里面通常放置許多不用的方法辫继,當(dāng)實(shí)現(xiàn)這個(gè)接口的時(shí)候,被迫設(shè)計(jì)冗余的代碼俗慈。

接口隔離原則的實(shí)現(xiàn)方法

在具體應(yīng)用接口隔離原則時(shí)姑宽,應(yīng)該根據(jù)以下幾個(gè)規(guī)則來(lái)衡量。

  • 接口盡量小闺阱,但是要有限度炮车。一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯。
  • 為依賴接口的類定制服務(wù)酣溃。只提供調(diào)用者需要的方法瘦穆,屏蔽不需要的方法。
  • 了解環(huán)境赊豌,拒絕盲從扛或。每個(gè)項(xiàng)目或產(chǎn)品都有選定的環(huán)境因素,環(huán)境不同碘饼,接口拆分的標(biāo)準(zhǔn)就不同深入了解業(yè)務(wù)邏輯熙兔。
  • 提高內(nèi)聚,減少對(duì)外交互艾恼。使接口用最少的方法去完成最多的事情住涉。

下面以學(xué)生成績(jī)管理程序?yàn)槔榻B接口隔離原則的應(yīng)用。

【例1】學(xué)生成績(jī)管理程序蒂萎。

分析:學(xué)生成績(jī)管理程序一般包含插入成績(jī)秆吵、刪除成績(jī)、修改成績(jī)五慈、計(jì)算總分纳寂、計(jì)算均分、打印成績(jī)信息泻拦、査詢成績(jī)信息等功能毙芜,如果將這些功能全部放到一個(gè)接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊争拐、統(tǒng)計(jì)模塊和打印模塊等 3 個(gè)模塊中腋粥,其類圖如圖 1 所示晦雨。

學(xué)生成績(jī)管理程序的類圖

圖1 學(xué)生成績(jī)管理程序的類圖

程序代碼如下:

package principle;
public class ISPtest
{
    public static void main(String[] args)
    {
        InputModule input = StuScoreList.getInputModule();
        CountModule count = StuScoreList.getCountModule();
        PrintModule print = StuScoreList.getPrintModule();
        input.insert();
        count.countTotalScore();
        print.printStuInfo();
        //print.delete();
    }
}
//輸入模塊接口
interface InputModule
{
    void insert();
    void delete();
    void modify();
}
//統(tǒng)計(jì)模塊接口
interface CountModule
{
    void countTotalScore();
    void countAverage();
}
//打印模塊接口
interface PrintModule
{
    void printStuInfo();
    void queryStuInfo();
}
//實(shí)現(xiàn)類
class StuScoreList implements InputModule,CountModule,PrintModule
{
    private StuScoreList(){}
    public static InputModule getInputModule()
    {
        return (InputModule)new StuScoreList();
    }
    public static CountModule getCountModule()
    {
        return (CountModule)new StuScoreList();
    }
    public static PrintModule getPrintModule()
    {
        return (PrintModule)new StuScoreList();
    }
    public void insert()
    {
        System.out.println("輸入模塊的insert()方法被調(diào)用!");
    }
    public void delete()
    {
        System.out.println("輸入模塊的delete()方法被調(diào)用隘冲!");
    }
    public void modify()
    {
        System.out.println("輸入模塊的modify()方法被調(diào)用闹瞧!");
    }
    public void countTotalScore()
    {
        System.out.println("統(tǒng)計(jì)模塊的countTotalScore()方法被調(diào)用!");
    }
    public void countAverage()
    {
        System.out.println("統(tǒng)計(jì)模塊的countAverage()方法被調(diào)用展辞!");
    }
    public void printStuInfo()
    {
        System.out.println("打印模塊的printStuInfo()方法被調(diào)用奥邮!");
    }
    public void queryStuInfo()
    {
        System.out.println("打印模塊的queryStuInfo()方法被調(diào)用!");
    }
}

程序的運(yùn)行結(jié)果如下:

輸入模塊的insert()方法被調(diào)用罗珍!
統(tǒng)計(jì)模塊的countTotalScore()方法被調(diào)用洽腺!
打印模塊的printStuInfo()方法被調(diào)用!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末覆旱,一起剝皮案震驚了整個(gè)濱河市蘸朋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扣唱,老刑警劉巖藕坯,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異噪沙,居然都是意外死亡堕担,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門曲聂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霹购,“玉大人,你說(shuō)我怎么就攤上這事朋腋∑敫恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵旭咽,是天一觀的道長(zhǎng)贞奋。 經(jīng)常有香客問(wèn)我,道長(zhǎng)穷绵,這世上最難降的妖魔是什么轿塔? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮仲墨,結(jié)果婚禮上勾缭,老公的妹妹穿的比我還像新娘。我一直安慰自己目养,他們只是感情好俩由,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著癌蚁,像睡著了一般幻梯。 火紅的嫁衣襯著肌膚如雪兜畸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天碘梢,我揣著相機(jī)與錄音咬摇,去河邊找鬼。 笑死煞躬,一個(gè)胖子當(dāng)著我的面吹牛菲嘴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汰翠,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昭雌!你這毒婦竟也來(lái)了复唤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烛卧,失蹤者是張志新(化名)和其女友劉穎佛纫,沒(méi)想到半個(gè)月后耐量,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寺鸥,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年扒俯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了局雄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甥啄。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炬搭,靈堂內(nèi)的尸體忽然破棺而出蜈漓,到底是詐尸還是另有隱情,我是刑警寧澤宫盔,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布融虽,位于F島的核電站,受9級(jí)特大地震影響灼芭,放射性物質(zhì)發(fā)生泄漏有额。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一彼绷、第九天 我趴在偏房一處隱蔽的房頂上張望巍佑。 院中可真熱鬧,春花似錦寄悯、人聲如沸句狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腻菇。三九已至胳螟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筹吐,已是汗流浹背糖耸。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丘薛,地道東北人嘉竟。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洋侨,于是被迫代替她去往敵國(guó)和親舍扰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361