接口隔離原則

  • 在軟件開發(fā)中惜索,為了提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性,增加軟件的可擴(kuò)展性和靈活性绍在,程序員要盡量根據(jù)7條原則來開發(fā)程序门扇,從而提高軟件的開發(fā)效率雹有,節(jié)約軟件開發(fā)成本和維護(hù)成本,我們將在下面的幾節(jié)中依次來介紹者7條原則臼寄,本節(jié)介紹里接口隔離原則

接口隔離原則定義

\color{#0000ff}{接口隔離原則(Interface SegregationPrinciple,ISP)}:設(shè)計(jì)編碼過程中盡量將臃腫龐大的接口拆分成更小的和更具體的接口霸奕,讓接口中只包含客戶感興趣的方法。

接口隔離原則由來

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 one class to another one should depend on the smallest interface).

為各個(gè)類建立他們需要的專用接口,不要試圖建立一個(gè)龐大的接口供所有依賴他的類調(diào)用留攒。
\color{#ff0000}{要注意接口定義的粒度煤惩,過小使類的使用變得繁雜,過大會(huì)失去靈活性炼邀,使用時(shí)要實(shí)現(xiàn)不必要的接口魄揉,增加類的使用風(fēng)險(xiǎn)。}

  • 接口隔離原則和單一職責(zé)都是為了提高類的內(nèi)聚力拭宁,降低他們之間耦合度洛退,體現(xiàn)了封裝的思想,但兩者是不同的:
  1. 單一職責(zé)原則注重職責(zé)杰标,接口隔離原則注重接口依賴的隔離
  2. 單一職責(zé)原則是約束類兵怯,它針對(duì)的是程序中的實(shí)現(xiàn)和細(xì)節(jié),接口隔離原則主要約束接口腔剂,這對(duì)抽象和程序整體框架的設(shè)計(jì)媒区。

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

1.降低接口粒度,提高接口靈活性掸犬,可維護(hù)性
2.提高系統(tǒng)內(nèi)聚性袜漩,減少對(duì)外互動(dòng),降低系統(tǒng)的耦合性
3.使類對(duì)外的暴露部分顯得有層次湾碎,接口間的繼承也可以使細(xì)粒度的接口之間有辨識(shí)度
4.減少冗余代碼噪服,沒有不必要的實(shí)現(xiàn)方法

接口合理原則實(shí)現(xiàn)方法

1.接口盡量有限度的小且只服務(wù)一個(gè)子模塊或業(yè)務(wù)邏輯
2.為依賴接口類定制服務(wù),只提供調(diào)用者需要的方法胜茧,屏蔽不需要的方法
3.深度了解業(yè)務(wù)粘优,盡可能按需分配,高內(nèi)聚呻顽,減少不必要的對(duì)外暴露雹顺,用最少的代碼完成業(yè)務(wù)

【例】 學(xué)生成績管理程序
分析:學(xué)生成績管理程序一般包含插入成績、刪除成績廊遍、修改成績嬉愧、計(jì)算總分、平均分喉前、打印没酣、查詢等功能王财。將他們分別放到不同模塊中,輸入模塊裕便、統(tǒng)計(jì)模塊绒净、打印模塊、如圖:


學(xué)生成績管理程序的類圖.png
  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)用视事!");
    }
}

打印輸出

輸入模塊的insert()方法被調(diào)用胆萧!
統(tǒng)計(jì)模塊的countTotalScore()方法被調(diào)用!
打印模塊的printStuInfo()方法被調(diào)用俐东!

總結(jié):接口隔離原則中心思想類對(duì)外暴露方法要高內(nèi)聚鸳碧、低耦合,在定義框架或?qū)崿F(xiàn)業(yè)務(wù)時(shí)犬性,要充分了解業(yè)務(wù),對(duì)業(yè)務(wù)進(jìn)行合理的接口邏輯分配腾仅。

下一篇 上一篇

原文

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末乒裆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子推励,更是在濱河造成了極大的恐慌鹤耍,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件验辞,死亡現(xiàn)場離奇詭異稿黄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跌造,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門杆怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壳贪,你說我怎么就攤上這事陵珍。” “怎么了违施?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵互纯,是天一觀的道長。 經(jīng)常有香客問我磕蒲,道長留潦,這世上最難降的妖魔是什么只盹? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮兔院,結(jié)果婚禮上殖卑,老公的妹妹穿的比我還像新娘。我一直安慰自己秆乳,他們只是感情好懦鼠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屹堰,像睡著了一般肛冶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯键,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天睦袖,我揣著相機(jī)與錄音,去河邊找鬼荣刑。 笑死馅笙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厉亏。 我是一名探鬼主播董习,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爱只!你這毒婦竟也來了皿淋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤恬试,失蹤者是張志新(化名)和其女友劉穎窝趣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體训柴,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哑舒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幻馁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洗鸵。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仗嗦,靈堂內(nèi)的尸體忽然破棺而出预麸,到底是詐尸還是另有隱情,我是刑警寧澤儒将,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布吏祸,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贡翘。R本人自食惡果不足惜蹈矮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸣驱。 院中可真熱鬧泛鸟,春花似錦、人聲如沸踊东。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸翅。三九已至再芋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坚冀,已是汗流浹背济赎。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留记某,地道東北人司训。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像液南,于是被迫代替她去往敵國和親壳猜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

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