1. 程式人生 > >橋接設計模式(Bridge)

橋接設計模式(Bridge)

prot 這一 職責 super 橋梁 引入 raw 依賴 tin

Bridge???

Bridge的意思是“橋梁”。就像在現實世界中,橋梁的功能是將河流的兩側連接起來一樣,Bridge模式的作用也是將兩樣東西連接起來,它們分別是類的功能層次結構和類的實現層次結構。

  • 父類通過聲明抽象方法來定義接口(APl):需要使用繼承強關聯方式,那麽必須使用中間層抽象子類來實現方法的可變性。所以在聚合關系中考慮引入DisplayImpl 抽象層
  • 子類通過實現具體方法來實現接口(APl):這種層次結構被稱為“類的實現層次結構”。當我們以其他方式實現AbstractClass時,例如要實現一個AnotherConcreteClass時,類的層次結構會稍微發生一些變化。

理解職責

通俗理解辦法:Bridge 是連通橋梁兩端 是具體抽象層 與具體的實現類 建立關系的必然。

需要明確的:序中依賴於操作系統的部分劃分為Windows版、Macintosh版、Unix版,那麽我們就可以用Bridge模式中的“類的實現層次結構”來表現這些依賴於操作系統的部分。也就是說,我們需要編寫一個定義這些操作系統的共同接口(API)的Implementor角色,然後編寫Windows版、Macintosh版、Unix版的3個Concretelmplementor角色。這樣一來,無論在“類的功能層次結構”中增加多少個功能,它們都可以工作於這3個操作系統上。

職責實現功能:完成不同功能的字符顯示

在橋的哪一側|名字|說明
|類的功能層次結構 ====>|Display|負責“顯示”的類
類的功能層次結構 ====>|CountDisplay|增加了“只顯示規定次數”這一功能的類
類的實現層次結構 ====>|DisplayImpl 負責“顯示”的類
|類的實現層次結構 ====>|stringDisplayImp1“用字符串顯示”的類
Main測試程序行為 ====>的類

UML

技術分享圖片

技術分享圖片

Code

Display:


public class Display {

    /**
     * 交給抽象子類去實現
     */
    private DisplayImpl displayimpl;

    public Display(DisplayImpl displayimpl) {
        this.displayimpl = displayimpl;
    }

    protected void open(){
          displayimpl.rawOpen();
    }

    protected void printr(){
         displayimpl.rawPrint();
    }

    protected void close(){
        displayimpl.rawClose();
    }

    public void display(){
        open();
        printr();
        close();
    }
}

假設需求改變 我們需要在Display基礎上增加功能:


public class randomDisplay extends Display {

    public randomDisplay(DisplayImpl displayimpl) {
        super(displayimpl);
    }


    public void randomDisplay(int times) {
        Random random = new Random();
        int len=random.nextInt(times);
        super.open();
        for (int i = 0; i < len; i++) {
            super.printr();
        }
        super.close();
    }
}

public class CountDisplay extends Display {

    public CountDisplay(DisplayImpl displayimpl) {
        super(displayimpl);
    }

    public void multiDisplay(int times){
        super.open();
        for (int i = 0; i < times; i++) {
            super.printr();
        }
        super.close();
    }
}

書上沒有明確這個 稱之為 抽象實現者 :我暫且稱之為 Bridge器 必須抽象


public abstract class DisplayImpl {

    /**
     *  作為bridge 強關聯 解耦的關鍵性 地方 不可以為 class 必須為abstract class
     */
    public abstract void rawOpen();

    public abstract void rawPrint();

    public abstract void rawClose();
}

測試:


 **/
public class MainT {


    public static void main(String[] args) {

       Display display=new Display(new StringDisplayImpl("bridge design method"));

       Display display1=new CountDisplay(new StringDisplayImpl("on first bridge"));

       display.display();

       display1.display();

       ((CountDisplay) display1).multiDisplay(3);

       // 隨機次數
        Display display2=new randomDisplay(new StringDisplayImpl("two sencond bridge"));

        ((randomDisplay) display2).randomDisplay(5);

    }
}

橋接設計模式(Bridge)