橋接設計模式(Bridge)
阿新 • • 發佈:2018-10-13
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)