Python設計模式-橋接模式
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()
該實現方法更適合不同語言的通用方法。
相關文章
- 設計模式-橋接模式設計模式橋接
- 設計模式:橋接模式設計模式橋接
- Java設計模式-橋接模式Java設計模式橋接
- 小白設計模式:橋接模式設計模式橋接
- 設計模式之橋接模式設計模式橋接
- 設計模式(八)——橋接模式設計模式橋接
- 設計模式之【橋接模式】設計模式橋接
- javascript設計模式橋接模式JavaScript設計模式橋接
- 設計模式(十二):橋接模式設計模式橋接
- PHP 設計模式之橋接模式PHP設計模式橋接
- GoLang設計模式19 - 橋接模式Golang設計模式橋接
- Java設計模式(7)----------橋接模式Java設計模式橋接
- 設計模式 | 橋接模式(bridge)設計模式橋接
- 9.設計模式-橋接模式設計模式橋接
- 極簡設計模式-橋接模式設計模式橋接
- 大話設計模式—橋接模式設計模式橋接
- 設計模式之橋接設計模式橋接
- 設計模式(七)橋接設計模式橋接
- 設計模式之旅12--橋接模式設計模式橋接
- Java設計模式之(六)——橋接模式Java設計模式橋接
- 23種設計模式(9)- 橋接模式設計模式橋接
- 設計模式系列 11-- 橋接模式設計模式橋接
- Android設計模式之橋接模式Android設計模式橋接
- java設計模式之一 橋接模式Java設計模式橋接
- 我學設計模式 之 橋接模式設計模式橋接
- 設計模式學習-裝飾模式,橋接模式設計模式橋接
- 《設計模式》 - 6. 橋接模式( Bridge )設計模式橋接
- 設計模式(十三)----結構型模式之橋接模式設計模式橋接
- 10.橋接模式設計思想橋接模式
- C#設計模式-橋接模式(Bridge Pattern)C#設計模式橋接
- C#設計模式系列:橋接模式(Bridge)C#設計模式橋接
- JAVA設計模式之 橋接模式【Bridge Pattern】Java設計模式橋接
- 設計模式--橋接模式Bridge(結構型)設計模式橋接
- 設計模式(五)橋接模式Bridge == Pointer To Implementation設計模式橋接
- 跟著GPT學設計模式之橋接模式GPT設計模式橋接
- 橋接模式橋接模式
- 從零開始學設計模式(七)—橋接模式設計模式橋接
- 設計模式學習-使用go實現橋接模式設計模式Go橋接