10.設計模式之八:橋接模式【結構型模式】

在現實生活中,某些類具備兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設計相似於 Photoshop 這樣的軟件,能畫不一樣形狀和不一樣顏色的圖形呢?若是用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對應的子類不少,並且擴展困難。python

固然,這樣的例子還有不少,如不一樣顏色和字體的文字、不一樣品牌和功率的汽車、不一樣性別和職業的男女、支持不一樣平臺和不一樣文件格式的媒體播放器等。若是用橋接模式就能很好地解決這些問題。編程

定義與特色

橋接(Bridge)模式的定義以下:將抽象與實現分離,使它們能夠獨立變化。它是用組合關係代替繼承關係來實現,從而下降了抽象和實現這兩個可變維度的耦合度。字體

橋接(Bridge)模式的優勢是:spa

  • 因爲抽象與實現分離,因此擴展能力強;
  • 其實現細節對客戶透明。

缺點是:因爲聚合關係創建在抽象層,要求開發者針對抽象化進行設計與編程,這增長了系統的理解與設計難度。設計

結構與實現

能夠將抽象化部分與實現化部分分開,取消兩者的繼承關係,改用組合關係。code

1. 模式的結構

橋接(Bridge)模式包含如下主要角色。對象

  1. 抽象化(Abstraction)角色:定義抽象類,幷包含一個對實現化對象的引用。
  2. 擴展抽象化(Refined    Abstraction)角色:是抽象化角色的子類,實現父類中的業務方法,並經過組合關係調用實現化角色中的業務方法。
  3. 實現化(Implementor)角色:定義實現化角色的接口,供擴展抽象化角色調用。
  4. 具體實現化(Concrete Implementor)角色:給出實現化角色接口的具體實現。

2. 模式的實現

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)。能夠按兩個維度定義爲顏色類和包類。接口

  • 顏色類(Color)是一個維度,定義爲實現化角色,它有兩個具體實現化角色:黃色和紅色,經過 getColor() 方法能夠選擇顏色;
  • 包類(Bag)是另外一個維度,定義爲抽象化角色,它有兩個擴展抽象化角色:挎包和錢包,它包含了顏色類對象,經過 getName() 方法能夠選擇相關顏色的挎包和錢包。

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()

橋接模式的應用場景

橋接模式一般適用於如下場景。

  1. 當一個類存在兩個獨立變化的維度,且這兩個維度都須要進行擴展時。
  2. 當一個系統不但願使用繼承或由於多層次繼承致使系統類的個數急劇增長時。
  3. 當一個系統須要在構件的抽象化角色和具體化角色之間增長更多的靈活性時。

橋接模式模式的擴展

在軟件開發中,有時橋接(Bridge)模式可與適配器模式聯合使用。當橋接(Bridge)模式的實現化角色的接口與現有類的接口不一致時,能夠在兩者中間定義一個適配器將兩者鏈接起來,其具體結構圖如圖所示。

相關文章
相關標籤/搜索