首頁 > 軟體

範例解析java設計模式七大原則介面隔離原則及優化

2022-02-11 13:02:17

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.介面隔離原則總結

類A通過介面Interface1依賴類B,類C通過介面Interfacel依賴類D,如果介面Interface1對於類A和類C來說不是最小介面,那麼類B和類D必須去實現他們不需要的方法。

將介面Interface1拆分為獨立的幾個介面,類A和類C分別與他們需要的介面建立依賴關係。也就是採用介面隔離原則。

以上就是範例分析java設計模式七大原則之介面隔離原則的詳細內容,更多關於java設計模式介面隔離原則的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com