接口隔離原則

接口隔離原則

定義:

一:

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

二:

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

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

不同點:

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

  • 單一職責(zé)原則注重的是職責(zé),而接口隔離原則注重的是對接口依賴的隔離逆济。
  • 單一職責(zé)原則主要是約束類酌予,它針對的是程序中的實現(xiàn)和細(xì)節(jié);接口隔離原則主要約束接口奖慌,主要針對抽象和程 序整體框架的構(gòu)建抛虫。

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

接口隔離原則是為了約束接口、降低類對接口的依賴性简僧,遵循接口隔離原則有以下 5 個優(yōu)點建椰。

  • 將臃腫龐大的接口分解為多個粒度小的接口,可以預(yù)防外來變更的擴(kuò)散岛马,提高系統(tǒng)的靈活性和可維護(hù)性棉姐。

  • 接口隔離提高了系統(tǒng)的內(nèi)聚性屠列,減少了對外交互,降低了系統(tǒng)的耦合性伞矩。

  • 如果接口的粒度大小定義合理笛洛,能夠保證系統(tǒng)的穩(wěn)定性;但是乃坤,如果定義過小苛让,則會造成接口數(shù)量過多,使設(shè)計復(fù)雜化湿诊;如果定義太大蝌诡,靈活性降低,無法提供定制服務(wù)枫吧,給整體項目帶來無法預(yù)料的風(fēng)險浦旱。

  • 使用多個專門的接口還能夠體現(xiàn)對象的層次,因為可以通過接口的繼承九杂,實現(xiàn)對總接口的定義颁湖。

  • 能減少項目工程中的代碼冗余。過大的大接口里面通常放置許多不用的方法例隆,當(dāng)實現(xiàn)這個接口的時候甥捺,被迫設(shè)計冗余的代碼。

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

在具體應(yīng)用接口隔離原則時镀层,應(yīng)該根據(jù)以下幾個規(guī)則來衡量镰禾。

  • 接口盡量小,但是要有限度唱逢。一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯吴侦。

  • 為依賴接口的類定制服務(wù)。只提供調(diào)用者需要的方法坞古,屏蔽不需要的方法备韧。

  • 了解環(huán)境,拒絕盲從痪枫。每個項目或產(chǎn)品都有選定的環(huán)境因素织堂,環(huán)境不同,接口拆分的標(biāo)準(zhǔn)就不同深入了解業(yè)務(wù)邏輯奶陈。

  • 提高內(nèi)聚易阳,減少對外交互。使接口用最少的方法去完成最多的事情吃粒。

舉個例子:

下面以學(xué)生成績管理程序為例介紹接口隔離原則的應(yīng)用潦俺。

分析:學(xué)生成績管理程序一般包含插入成績、刪除成績、修改成績黑竞、計算總分捕发、計算均分、打印成績信息很魂、査詢成績信息等功能扎酷,如果將這些功能全部放到一個接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊遏匆、統(tǒng)計模塊和打印模塊等 3 個模塊中法挨,其類圖如圖 1 所示。

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

程序代碼如下:

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)計模塊接口
interface CountModule
{
    void countTotalScore();
    void countAverage();
}
//打印模塊接口
interface PrintModule
{
    void printStuInfo();
    void queryStuInfo();
}
//實現(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)計模塊的countTotalScore()方法被調(diào)用帝蒿!");
    }
    public void countAverage()
    {
        System.out.println("統(tǒng)計模塊的countAverage()方法被調(diào)用荐糜!");
    }
    public void printStuInfo()
    {
        System.out.println("打印模塊的printStuInfo()方法被調(diào)用!");
    }
    public void queryStuInfo()
    {
        System.out.println("打印模塊的queryStuInfo()方法被調(diào)用葛超!");
    }
}

衡量標(biāo)準(zhǔn):

接口隔離原則是對接口的定義暴氏,同時也是對類的定義,接口和類盡量使用原子接口或原子類來組裝绣张。但是答渔,這個原子該怎么劃分是設(shè)計模式中的一大難題,在實踐中可以根據(jù)以下幾個規(guī)則來衡量:

  • 一個接口只服務(wù)于一個子模塊或業(yè)務(wù)邏輯侥涵;

  • 通過業(yè)務(wù)邏輯壓縮接口中的public方法沼撕,接口時常去回顧,盡量讓接口達(dá)到“滿身筋骨肉”芜飘,而不是“肥嘟嘟”的一大堆方法务豺;

  • 已經(jīng)被污染了的接口,盡量去修改燃箭,若變更的風(fēng)險較大冲呢,則采用適配器模式進(jìn)行轉(zhuǎn)化處理;

  • 了解環(huán)境招狸,拒絕盲從。每個項目或產(chǎn)品都有特定的環(huán)境因素邻薯,別看到大師是這樣做的你就照抄裙戏。千萬別,環(huán)境不同厕诡,接口拆分的標(biāo)準(zhǔn)就不同累榜。深入了解業(yè)務(wù)邏輯,最好的接口設(shè)計就出自你的手中!

大家多和熱水~早點休息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壹罚,一起剝皮案震驚了整個濱河市葛作,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌猖凛,老刑警劉巖赂蠢,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辨泳,居然都是意外死亡虱岂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進(jìn)店門菠红,熙熙樓的掌柜王于貴愁眉苦臉地迎上來第岖,“玉大人,你說我怎么就攤上這事试溯∶镒遥” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵遇绞,是天一觀的道長烫饼。 經(jīng)常有香客問我,道長试读,這世上最難降的妖魔是什么杠纵? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮钩骇,結(jié)果婚禮上比藻,老公的妹妹穿的比我還像新娘。我一直安慰自己倘屹,他們只是感情好银亲,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纽匙,像睡著了一般务蝠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烛缔,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天馏段,我揣著相機(jī)與錄音,去河邊找鬼践瓷。 笑死院喜,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晕翠。 我是一名探鬼主播喷舀,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硫麻?” 一聲冷哼從身側(cè)響起爸邢,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拿愧,沒想到半個月后杠河,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡赶掖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年感猛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奢赂。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡陪白,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膳灶,到底是詐尸還是另有隱情咱士,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布轧钓,位于F島的核電站序厉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏毕箍。R本人自食惡果不足惜弛房,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望而柑。 院中可真熱鬧文捶,春花似錦、人聲如沸媒咳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涩澡。三九已至顽耳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妙同,已是汗流浹背射富。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留渐溶,地道東北人辉浦。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像茎辐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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