最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設計模式之接口隔離原則精解

 更新時間:2022年02月08日 11:40:20   作者:張起靈-小哥  
設計模式(Design pattern)代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟件開發(fā)人員在軟件開發(fā)過程中面臨的一般問題的解決方案。本篇介紹設計模式七大原則之一的接口隔離原則

1.什么是接口隔離原則?

客戶端不應該依賴它不需要的接口,即一個類對另一個類的依賴應該建立在最小的接口范圍上。

2.對應代碼

上面這張圖呢,就違反了接口隔離原則。它對應的代碼如下:??????

package com.szh.principle.segregation;
 
/**
 *
 */
interface Interface1 {
    void operation1();
    void operation2();
    void operation3();
    void operation4();
    void operation5();
}
 
class B implements Interface1 {
    public void operation1() {
        System.out.println("B 實現了 operation1");
    }
    public void operation2() {
        System.out.println("B 實現了 operation2");
    }
    public void operation3() {
        System.out.println("B 實現了 operation3");
    }
    public void operation4() {
        System.out.println("B 實現了 operation4");
    }
    public void operation5() {
        System.out.println("B 實現了 operation5");
    }
}
 
class D implements Interface1 {
    public void operation1() {
        System.out.println("D 實現了 operation1");
    }
    public void operation2() {
        System.out.println("D 實現了 operation2");
    }
    public void operation3() {
        System.out.println("D 實現了 operation3");
    }
    public void operation4() {
        System.out.println("D 實現了 operation4");
    }
    public void operation5() {
        System.out.println("D 實現了 operation5");
    }
}
 
class A { //A 類通過接口Interface1 依賴(使用) B類,但是只會用到1,2,3方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
    public void depend2(Interface1 i) {
        i.operation2();
    }
    public void depend3(Interface1 i) {
        i.operation3();
    }
}
 
class C { //C 類通過接口Interface1 依賴(使用) D類,但是只會用到1,4,5方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
    public void depend4(Interface1 i) {
        i.operation4();
    }
    public void depend5(Interface1 i) {
        i.operation5();
    }
}
 
public class Segregation1 {
    public static void main(String[] args) {
        A a = new A();
        a.depend1(new B()); // A類通過接口去依賴B類
        a.depend2(new B());
        a.depend3(new B());
 
        C c = new C();
        c.depend1(new D()); // C類通過接口去依賴(使用)D類
        c.depend4(new D());
        c.depend5(new D());
    }
}

代碼雖然很長,但是不難理解。A類依賴了B類,但是只會用到頂級接口中的1、2、3這三個方法;而C類依賴了D類,但是只會用到頂級接口中的1、4、5這三個方法,也就是說在A和B這兩個類的層面上而言,和頂級接口中的4、5兩個方法是沒什么關聯的,那么B類在實現頂級接口的時候就沒必要重寫4、5這兩個方法了。但是這里有一個問題就是頂級接口中包括了1到5這五個方法,你如果實現這個接口就必須重寫這五個方法,那么我們就可以考慮將頂級接口拆分成多個接口,需要用到哪個就實現哪個,這也就是所謂的接口隔離了。

3.改進代碼

經過上面的一番敘述,我們可以將代碼改寫成下面的形式。

即將頂級接口拆分成3個小接口,B、D兩個類根據實際情況該實現哪個接口就實現哪個接口(因為這五個方法已經被分開了)。

package com.szh.principle.segregation.improve;
 
/**
 *
 */
interface Interface1 {
    void operation1();
}
 
interface Interface2 {
    void operation2();
    void operation3();
}
 
interface Interface3 {
    void operation4();
    void operation5();
}
 
class B implements Interface1, Interface2 {
    public void operation1() {
        System.out.println("B 實現了 operation1");
    }
 
    public void operation2() {
        System.out.println("B 實現了 operation2");
    }
 
    public void operation3() {
        System.out.println("B 實現了 operation3");
    }
}
 
class D implements Interface1, Interface3 {
    public void operation1() {
        System.out.println("D 實現了 operation1");
    }
 
    public void operation4() {
        System.out.println("D 實現了 operation4");
    }
 
    public void operation5() {
        System.out.println("D 實現了 operation5");
    }
}
 
class A { // A 類通過接口Interface1,Interface2 依賴(使用) B類,但是只會用到1,2,3方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
 
    public void depend2(Interface2 i) {
        i.operation2();
    }
 
    public void depend3(Interface2 i) {
        i.operation3();
    }
}
 
class C { // C 類通過接口Interface1,Interface3 依賴(使用) D類,但是只會用到1,4,5方法
    public void depend1(Interface1 i) {
        i.operation1();
    }
 
    public void depend4(Interface3 i) {
        i.operation4();
    }
 
    public void depend5(Interface3 i) {
        i.operation5();
    }
}
 
public class Segregation2 {
    public static void main(String[] args) {
        A a = new A();
        a.depend1(new B()); // A類通過接口去依賴B類
        a.depend2(new B());
        a.depend3(new B());
 
        C c = new C();
        c.depend1(new D()); // C類通過接口去依賴(使用)D類
        c.depend4(new D());
        c.depend5(new D());
    }
}

4.接口隔離原則總結

  1. 類A通過接口Interface1依賴類B,類C通過接口Interfacel依賴類D,如果接口Interface1對于類A和類C來說不是最小接口,那么類B和類D必須去實現他們不需要的方法。
  2. 將接口Interface1拆分為獨立的幾個接口,類A和類C分別與他們需要的接口建立依賴關系。也就是采用接口隔離原則。

到此這篇關于Java設計模式之接口隔離原則精解的文章就介紹到這了,更多相關Java 接口隔離原則內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mybatis insert foreach循環(huán)插入方式

    mybatis insert foreach循環(huán)插入方式

    這篇文章主要介紹了mybatis insert foreach循環(huán)插入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java編程BigDecimal用法實例分享

    Java編程BigDecimal用法實例分享

    這篇文章主要介紹了Java編程BigDecimal用法實例分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 解決IDEA安裝插件搜索不到插件的問題

    解決IDEA安裝插件搜索不到插件的問題

    這篇文章主要介紹了解決IDEA安裝插件搜索不到插件的問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 詳解Spring容器的使用流程

    詳解Spring容器的使用流程

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著Spring容器的使用流程展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java 代理(Proxy)的原理及應用

    Java 代理(Proxy)的原理及應用

    動態(tài)代理技術就是用來產生一個對象的代理對象的。 我們在開發(fā)中之所以要產生一個對象的代理對象,主要用于攔截對真實業(yè)務對象的訪問。本文主要介紹了Java 代理的使用,感興趣的可以了解一下
    2021-05-05
  • java數據結構與算法之簡單選擇排序詳解

    java數據結構與算法之簡單選擇排序詳解

    這篇文章主要介紹了java數據結構與算法之簡單選擇排序,結合實例形式分析了選擇排序的原理、實現方法與相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • 詳解java中的synchronized關鍵字

    詳解java中的synchronized關鍵字

    這篇文章主要介紹了java中的synchronized關鍵字,可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執(zhí)行這段代碼,感興趣的小伙伴們可以參考一下
    2015-12-12
  • SpringBoot參數校驗之@Valid與@Validated的用法與場景

    SpringBoot參數校驗之@Valid與@Validated的用法與場景

    這篇文章主要介紹了SpringBoot參數校驗的用法與場景,在實際開發(fā)中,參數校驗是保證接口安全性和數據完整性的重要手段,Spring Boot提供了@Valid和@Validated兩個核心注解來實現參數校驗,但許多開發(fā)者對它們的區(qū)別和使用場景存在疑惑,需要的朋友可以參考下
    2025-02-02
  • IntelliJ?IDEA運行SpringBoot項目的詳細步驟

    IntelliJ?IDEA運行SpringBoot項目的詳細步驟

    這篇文章主要介紹了IntelliJ?IDEA如何運行SpringBoot項目,步驟一配置maven,步驟二配置JDK環(huán)境,緊接著通過步驟三檢查數據庫的配置,最后一步數據庫連接,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Curator實現zookeeper的節(jié)點監(jiān)聽詳解

    Curator實現zookeeper的節(jié)點監(jiān)聽詳解

    這篇文章主要介紹了Curator實現zookeeper的節(jié)點監(jiān)聽詳解,Curtor框架中一共有三個實現監(jiān)聽的方式,一種是NodeCache監(jiān)聽指定節(jié)點,一種是pathChildrenCache監(jiān)聽子節(jié)點,一種是TreeCache可以監(jiān)控所有節(jié)點 相當于以上兩種的合集,需要的朋友可以參考下
    2023-12-12

最新評論

余干县| 潜江市| 静海县| 溆浦县| 观塘区| 桓仁| 仲巴县| 静宁县| 合肥市| 烟台市| 宿松县| 大庆市| 高雄县| 吴忠市| 剑河县| 琼中| 同德县| 咸丰县| 安溪县| 宣化县| 海晏县| 砚山县| 象山县| 临猗县| 留坝县| 新蔡县| 陈巴尔虎旗| 泰安市| 鸡西市| 昭觉县| 滦平县| 思南县| 白山市| 房山区| 恭城| 嘉善县| 德昌县| 蓝田县| 台江县| 吉林省| 天全县|