在現實生活中,某些類具備兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設計相似於 Photoshop 這樣的軟件,能畫不一樣形狀和不一樣顏色的圖形呢?若是用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對應的子類不少,並且擴展困難。python
固然,這樣的例子還有不少,如不一樣顏色和字體的文字、不一樣品牌和功率的汽車、不一樣性別和職業的男女、支持不一樣平臺和不一樣文件格式的媒體播放器等。若是用橋接模式就能很好地解決這些問題。編程
橋接(Bridge)模式的定義以下:將抽象與實現分離,使它們能夠獨立變化。它是用組合關係代替繼承關係來實現,從而下降了抽象和實現這兩個可變維度的耦合度。字體
橋接(Bridge)模式的優勢是:spa
缺點是:因爲聚合關係創建在抽象層,要求開發者針對抽象化進行設計與編程,這增長了系統的理解與設計難度。設計
能夠將抽象化部分與實現化部分分開,取消兩者的繼承關係,改用組合關係。code
橋接(Bridge)模式包含如下主要角色。對象
class Implemter(object): def OperatiomImpl(self): pass class ConcreteImplementA(Implemter): def OperatiomImpl(self): print('ConcreteImplement A') class ConcreteImplementB(Implemter): def OperatiomImpl(self): print('ConcreteImplement B') class Abstraction(object): _imple = None def __init__(self, imple): self._imple = imple def operation(self): pass class RefinedAbstrcation(Abstraction): def __init__(self, imple): super().__init__(imple) def operation(self): print('擴展抽象化(Refined Abstraction)角色被訪問') self._imple.OperatiomImpl() if __name__ == '__main__': imple = ConcreteImplementA() abs = RefinedAbstrcation(imple) abs.operation()
用橋接(Bridge)模式模擬女士皮包的選購。blog
分析:女士皮包有不少種,能夠按用途分、按皮質分、按品牌分、按顏色分、按大小分等,存在多個維度的變化,因此採用橋接模式來實現女士皮包的選購比較合適。繼承
本實例按用途分可選錢包(Wallet)和挎包(HandBag),按顏色分可選黃色(Yellow)和紅色(Red)。能夠按兩個維度定義爲顏色類和包類。接口
class Color(object): def get_color(self): pass class Yellow(Color): def get_color(self): return "黃色" class Red(Color): def get_color(self): return '紅色' class Bag(object): _color = None def set_color(self, color): self._color = color def get_name(self): pass class HandBag(Bag): def get_name(self): print(self._color.get_color(), "挎包") class Wallet(Bag): def get_name(self): print(self._color.get_color(), "錢包") if __name__ == '__main__': y = Yellow() r = Red() hb = HandBag() hb.set_color(y) hb.get_name()
橋接模式一般適用於如下場景。
在軟件開發中,有時橋接(Bridge)模式可與適配器模式聯合使用。當橋接(Bridge)模式的實現化角色的接口與現有類的接口不一致時,能夠在兩者中間定義一個適配器將兩者鏈接起來,其具體結構圖如圖所示。