Python設計模式-橋接模式

小屋子大俠發表於2017-06-23

Python設計模式-橋接模式

基於Python3.5.2,程式碼如下

#coding:utf-8

class Shape():
    name = ""
    param = ""
    def __init__(self,*param):
        pass
    def getName(self):
        return self.name
    def getParam(self):
        return self.name,self.param

class Pen():
    shape = ""
    type = ""
    def __init__(self,shape):
        self.shape = shape
    def draw(self):
        pass

class Rectangle(Shape):
    def __init__(self,long,width):
        self.name = "Rectangle"
        self.param = "Long:%s  Width:%s"%(long,width)

class Circle(Shape):
    def __init__(self,radius):
        self.name = "Circle"
        self.param = "Radius :%s"%(radius)

class NormalPen(Pen):
    def __init__(self,shape):
        Pen.__init__(self,shape)
        self.type = "Normal Line"
    def draw(self):
        print("draw ",self.type,self.shape.getName(),self.shape.getParam())


class BrushPen(Pen):
    def __init__(self, shape):
        Pen.__init__(self, shape)
        self.type = "BrushPen Line"

    def draw(self):
        print("draw ", self.type, self.shape.getName(), self.shape.getParam())


if __name__ == "__main__":
    rect = Rectangle("10","20")
    cir = Circle("15")
    n = NormalPen(rect)
    n.draw()
    n1 = NormalPen(cir)
    n1.draw()
    b = BrushPen(rect)
    b.draw()

橋接模式分析與解讀

橋接模式

將抽象部分與它的實現部分分離,使它們都可以獨立變化。在橋接模式的基礎是建立在合成/聚合複用原則(CARP),儘量使用合成/聚合。聚合表示一種弱的擁有關係,體現的是A物件可以包含B物件,但B物件不是A物件的一部分;合成則是一種強的擁有關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。例如,人的眼睛和人是部分和整體的關係,並且兩者擁有同樣的生命週期,所以就屬於合成關係;一群皮皮蝦裡,每隻皮皮蝦都屬於蝦群,一個蝦群擁有多隻皮皮蝦,所以皮皮蝦對應蝦群就是聚合關係。這裡對類的繼承進行說明,物件的繼承關係是在編譯時就定義好了,所以無法再執行時改變從父類繼承的實現,子類的實現與它的父類有非常緊密的依賴關係,以至於父類實現中的任何變化必然導致子類發生變化,當你需要複用子類時,如果繼承下來的實現不合適解決新的問題,則父類必須重寫或被其他更合適的類替換,這種依賴關係限制了靈活性並最終限制了複用性。在橋接模式下,就是將兩個類進行聚合,使兩個類分別實現,而不進行繼承實現。

橋接模式的適用場景

1、不適用繼承或者原繼承關係中抽象類可能頻繁變動的情況,可以將原類進行拆分,拆成實現花角色和抽象化角色;
2、重用性比較大的場景。比如開關控制邏輯的程式,開關就是抽象畫角色,開關的形式有很多種,操作的實現化角色有很多種。

解讀

程式碼中,分別定義了形狀類(Shape)和畫筆類(Pen),然後通過各自父類進行繼承實現:
1、定義了Shape的子類Rectangle和Circle,分別定義相應引數;
2、定義了Pen的子類NormalPen和BrushPen,並在初始化的時候傳入對應的Shape類,分別實現不同的draw()方法,來實現與Shpae類物件進行關聯;
3、在客戶端呼叫時,先生成對應的Shape類,然後將生成的Shape類在Pen類初始化的時候傳入,再呼叫draw()方法,來實現不同形狀的draw;

程式執行結果如下:

draw Normal Line Rectangle (‘Rectangle’, ‘Long:10 Width:20’)
draw Normal Line Circle (‘Circle’, ‘Radius :15’)
draw BrushPen Line Rectangle (‘Rectangle’, ‘Long:10 Width:20’)
通過執行結果,當傳入不同的形狀型別時,繪製了不同的形狀,如果需要新增Shape型別,只需要繼承Shape類,然後實現相應方法,符合對擴充套件開發,對修改封閉原則。

橋接模式的優缺點

優點:

1、抽象角色與實現角色相分離,二者可以獨立設計,不受約束;
2、擴充套件性強:抽象角色和實現角色可以非常靈活地擴充套件。

缺點:

1、增加對系統理解的難度。

備註

# 介面實現類
class Implementor:
    def Operation(self):
        raise NotImplementedError

class ConcreteImplementorA(Implementor):
    def Operation(self):
        print("實現 A的方法")

class ConcreteImplementorB(Implementor):
    def Operation(self):
        print("實現 B的方法")
# 抽象類
class Abstraction():
    def __init__(self,implementor):
        self.implementor = implementor
    def Operation(self):
        raise NotImplementedError

class RefineAbstraction(Abstraction):
    def Operation(self):
        self.implementor.Operation()

if __name__ == "__main__":
    a = ConcreteImplementorA()
    b = ConcreteImplementorB()
    aa = RefineAbstraction(a)
    ab = RefineAbstraction(b)
    aa.Operation()
    ab.Operation()
該實現方法更適合不同語言的通用方法。

相關文章