国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

舉例說明Java設(shè)計模式編程中ISP接口隔離原則的使用

2019-11-26 14:37:55
字體:
供稿:網(wǎng)友

Interface Segregation Principle,ISP接口隔離原則主張使用多個專門的接口比使用單一的總接口要好。
一個類對另外一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上的。
一個接口代表一個角色,不應(yīng)當(dāng)將不同的角色都交給一個接口。沒有關(guān)系的接口合并在一起,形成一個臃腫的大接口,這是對角色和接口的污染。
“不應(yīng)該強(qiáng)迫客戶依賴于它們不用的方法。接口屬于客戶,不屬于它所在的類層次結(jié)構(gòu)。”這個說得很明白了,再通俗點說,不要強(qiáng)迫客戶使用它們不用的方法,如果強(qiáng)迫用戶使用它們不使用的方法,那么這些客戶就會面臨由于這些不使用的方法的改變所帶來的改變。

使用場合,提供調(diào)用者需要的方法,屏蔽不需要的方法.滿足接口隔離原則.比如說電子商務(wù)的系統(tǒng),有訂單這個類,有三個地方會使用到,

  1. 一個是門戶,只能有查詢方法,
  2. 一個是外部系統(tǒng),有添加訂單的方法,
  3. 一個是管理后臺,添加刪除修改查詢都要用到.

根據(jù)接口隔離原則(ISP),一個類對另外一個類的依賴性應(yīng)當(dāng)是建立在最小的接口上.

也就是說,對于門戶,它只能依賴有一個查詢方法的接口.
UML結(jié)構(gòu)如下:

201623120354048.jpg (397×369)

我們來看一個無視接口隔離原則的Java接口編寫例子:

interface I {   public void method1();   public void method2();   public void method3();   public void method4();   public void method5(); }  class A{   public void depend1(I i){     i.method1();   }   public void depend2(I i){     i.method2();   }   public void depend3(I i){     i.method3();   } }  class B implements I{   public void method1() {     System.out.println("類B實現(xiàn)接口I的方法1");   }   public void method2() {     System.out.println("類B實現(xiàn)接口I的方法2");   }   public void method3() {     System.out.println("類B實現(xiàn)接口I的方法3");   }   //對于類B來說,method4和method5不是必需的,但是由于接口A中有這兩個方法,   //所以在實現(xiàn)過程中即使這兩個方法的方法體為空,也要將這兩個沒有作用的方法進(jìn)行實現(xiàn)。   public void method4() {}   public void method5() {} }  class C{   public void depend1(I i){     i.method1();   }   public void depend2(I i){     i.method4();   }   public void depend3(I i){     i.method5();   } }  class D implements I{   public void method1() {     System.out.println("類D實現(xiàn)接口I的方法1");   }   //對于類D來說,method2和method3不是必需的,但是由于接口A中有這兩個方法,   //所以在實現(xiàn)過程中即使這兩個方法的方法體為空,也要將這兩個沒有作用的方法進(jìn)行實現(xiàn)。   public void method2() {}   public void method3() {}    public void method4() {     System.out.println("類D實現(xiàn)接口I的方法4");   }   public void method5() {     System.out.println("類D實現(xiàn)接口I的方法5");   } }  public class Client{   public static void main(String[] args){     A a = new A();     a.depend1(new B());     a.depend2(new B());     a.depend3(new B());          C c = new C();     c.depend1(new D());     c.depend2(new D());     c.depend3(new D());   } } 

        可以看到,如果接口過于臃腫,只要接口中出現(xiàn)的方法,不管對依賴于它的類有沒有用處,實現(xiàn)類中都必須去實現(xiàn)這些方法,這顯然不是好的設(shè)計。如果將這個設(shè)計修改為符合接口隔離原則,就必須對接口I進(jìn)行拆分。在這里我們將原有的接口I拆分為三個接口,拆分后的設(shè)計如下圖所示:

201623120431437.jpg (476×288)

照例貼出程序的代碼,供不熟悉類圖的朋友參考:

interface I1 {   public void method1(); }  interface I2 {   public void method2();   public void method3(); }  interface I3 {   public void method4();   public void method5(); }  class A{   public void depend1(I1 i){     i.method1();   }   public void depend2(I2 i){     i.method2();   }   public void depend3(I2 i){     i.method3();   } }  class B implements I1, I2{   public void method1() {     System.out.println("類B實現(xiàn)接口I1的方法1");   }   public void method2() {     System.out.println("類B實現(xiàn)接口I2的方法2");   }   public void method3() {     System.out.println("類B實現(xiàn)接口I2的方法3");   } }  class C{   public void depend1(I1 i){     i.method1();   }   public void depend2(I3 i){     i.method4();   }   public void depend3(I3 i){     i.method5();   } }  class D implements I1, I3{   public void method1() {     System.out.println("類D實現(xiàn)接口I1的方法1");   }   public void method4() {     System.out.println("類D實現(xiàn)接口I3的方法4");   }   public void method5() {     System.out.println("類D實現(xiàn)接口I3的方法5");   } } 

        接口隔離原則的含義是:建立單一接口,不要建立龐大臃腫的接口,盡量細(xì)化接口,接口中的方法盡量少。也就是說,我們要為各個類建立專用的接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調(diào)用。本文例子中,將一個龐大的接口變更為3個專用的接口所采用的就是接口隔離原則。在程序設(shè)計中,依賴幾個專用的接口要比依賴一個綜合的接口更靈活。接口是設(shè)計時對外部設(shè)定的“契約”,通過分散定義多個接口,可以預(yù)防外來變更的擴(kuò)散,提高系統(tǒng)的靈活性和可維護(hù)性。
         說到這里,很多人會覺的接口隔離原則跟之前的單一職責(zé)原則很相似,其實不然。其一,單一職責(zé)原則原注重的是職責(zé);而接口隔離原則注重對接口依賴的隔離。其二,單一職責(zé)原則主要是約束類,其次才是接口和方法,它針對的是程序中的實現(xiàn)和細(xì)節(jié);而接口隔離原則主要約束接口接口,主要針對抽象,針對程序整體框架的構(gòu)建。
         采用接口隔離原則對接口進(jìn)行約束時,要注意以下幾點:
接口盡量小,但是要有限度。對接口進(jìn)行細(xì)化可以提高程序設(shè)計靈活性是不掙的事實,但是如果過小,則會造成接口數(shù)量過多,使設(shè)計復(fù)雜化。所以一定要適度。
為依賴接口的類定制服務(wù),只暴露給調(diào)用的類它需要的方法,它不需要的方法則隱藏起來。只有專注地為一個模塊提供定制服務(wù),才能建立最小的依賴關(guān)系。
提高內(nèi)聚,減少對外交互。使接口用最少的方法去完成最多的事情。
運(yùn)用接口隔離原則,一定要適度,接口設(shè)計的過大或過小都不好。設(shè)計接口的時候,只有多花些時間去思考和籌劃,才能準(zhǔn)確地實踐這一原則。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宜章县| 巴青县| 大冶市| 乌海市| 准格尔旗| 汽车| 汉源县| 大安市| 闵行区| 广水市| 冀州市| 广东省| 萨嘎县| 普安县| 中牟县| 宁波市| 沧州市| 吴川市| 芦山县| 丰原市| 荔浦县| 健康| 中西区| 五常市| 乐安县| 涡阳县| 武胜县| 淳化县| 漳平市| 宝清县| 津南区| 大邑县| 永泰县| 松潘县| 米泉市| 东港市| 东明县| 泰和县| 永嘉县| 延长县| 利辛县|