概括
|
名稱 |
Bridge |
|
結構 |
|
|
動機 |
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 |
|
適用性 |
-
你不希望在抽象和它的實現部分之間有一個固定的綁定關係。例如這種情況可能是因為,在程式運行時刻實現部分應可以被選擇或者切換。
-
類的抽象以及它的實現都應該可以通過產生子類的方法加以擴充。這時B r i d g e 模式使你可以對不同的抽象介面和實現部分進行組合,並分別對它們進行擴充。
-
對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼不必重新編譯。
-
(C + +)你想對客戶完全隱藏抽象的實現部分。在C + +中,類的表示在類介面中是可見的。
-
有許多類要產生。這樣一種類階層說明你必須將一個對象分解成兩個部分。R u m b a u g h 稱這種類階層為?嵌套的普化?(nested generalizations )。
-
你想在多個對象間共用實現(可能使用引用計數),但同時要求客戶並不知道這一點。一個簡單的例子便是C o p l i e n 的S t r i n g 類[ C o p 9 2 ],在這個類中多個對象可以共用同一個字串表示(S t r i n g R e p )。
|
解析
形象比喻:
BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM新做了個髮型怎麼說”這種問題,自己用BRIDGE組合一下不就行了
橋樑模式:將抽象化與實現化脫耦,使得二者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在一個軟體系統的抽象化和實現化之間使用組合/彙總關係而不是繼承關係,從而使兩者可以獨立的變化。
1.Abstraction
定義抽象類別的介面。
維護一個指向Implementor類型對象的指標。
2.RefinedAbstraction
擴充由Abstraction定義的介面。
3.Implementor
定義實作類別的介面,該介面不一定要與Abstraction的介面完全一致。
事實上這兩個介面可以完全不同。
一般來講,Implementor介面僅提供基本操作,而Abstraction則定義了基於這些基本操作的較高層次的操作。
4.ConcreteImplementor
實現Implementor介面並定義它的具體實現。
執行個體
這裡的例子是有 軟體產品和硬體產品兩類產品,與金屬封裝和塑料封裝兩類封裝。
使用橋接模式將產品類和封裝類結合起來,就可以使用四種狀況了:
軟體金屬封裝
軟體塑料封裝
硬體金屬封裝
硬體塑料封裝
涉及的檔案有:
Product.java
-- SoftwareProduct.java
-- HardwareProduct.java
Package.java
-- MetalPackage.java
-- PlasticPackage.java
TestMain.java
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public abstract class Product {private String type;/** * @return the type */public String getType() {return type;}/** * @param type * the type to set */public void setType(String type) {this.type = type;}}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public class SoftwareProduct extends Product {public SoftwareProduct() {setType("Software");}public void pack(Package package0){package0.packProduct(this);}}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public class HardwareProduct extends Product {public HardwareProduct() {setType("Hardware");}public void pack(Package package0) {package0.packProduct(this);}}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public abstract class Package {public abstract void packProduct(Product product);}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public class MetalPackage extends Package {/* * (non-Javadoc) * * @see designptn.bridge.Package#packProduct(designptn.bridge.Product) */@Overridepublic void packProduct(Product product) {// TODO Auto-generated method stubSystem.out.println(product.getType() + " pack Metal Package");}}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public class PlasticPackage extends Package {/* * (non-Javadoc) * * @see designptn.bridge.Package#packProduct(designptn.bridge.Product) */@Overridepublic void packProduct(Product product) {// TODO Auto-generated method stubSystem.out.println(product.getType() + " pack Plastic Package");}}
/** * @author oscar999 * @date 2013-7-24 * @version V1.0 */package designptn.bridge;public class TestMain {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubProduct sProduct = new SoftwareProduct();Product hProduct = new HardwareProduct();Package mPackage = new MetalPackage();Package pPackage = new PlasticPackage();mPackage.packProduct(sProduct);pPackage.packProduct(sProduct);mPackage.packProduct(hProduct);pPackage.packProduct(hProduct);}}