11-Python與設計模式--橋樑模式
一、畫筆與形狀
在介紹原型模式的一節中,我們舉了個圖層的例子,這一小節內容,我們同樣以類似畫圖的例子,說明一種結構類設計模式:橋樑模式。
在一個畫圖程式中,常會見到這樣的情況:有一些預設的圖形,如矩形、圓形等,還有一個物件-畫筆,調節畫筆的型別(如畫筆還是畫刷,還是毛筆效果等)並設定引數(如顏色、線寬等),選定圖形,就可以在畫布上畫出想要的圖形了。要實現以上需求,先從最抽象的元素開始設計,即形狀和畫筆(暫時忽略畫布,同時忽略畫筆引數,只考慮畫筆型別)。
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) print "Create a rectangle:%s"%self.param class Circle(Shape): def __init__(self,radius): self.name="Circle" self.param="Radius:%s"%radius print "Create a circle:%s"%self.param
緊接著是構造多種畫筆,如普通畫筆和畫刷:
class NormalPen(Pen): def __init__(self,shape): Pen.__init__(self,shape) self.type="Normal Line" def draw(self): print "DRAWING %s:%s----PARAMS:%s"%(self.type,self.shape.getName(),self.shape.getParam()) class BrushPen(Pen): def __init__(self,shape): Pen.__init__(self,shape) self.type="Brush Line" def draw(self): print "DRAWING %s:%s----PARAMS:%s" % (self.type,self.shape.getName(), self.shape.getParam())
業務中的邏輯如下:
if __name__=="__main__": normal_pen=NormalPen(Rectangle("20cm","10cm")) brush_pen=BrushPen(Circle("15cm")) normal_pen.draw() brush_pen.draw()
列印如下:
Create a rectangle:Long:20cm Width:10cm
Create a circle:Radius:15cm
DRAWING Normal Line:Rectangle----PARAMS:('Rectangle', 'Long:20cm Width10cm')
DRAWING Brush Line:Circle----PARAMS:('Circle', 'Radius:15cm')
二、橋樑模式
橋樑模式又叫橋接模式,定義如下:將抽象與實現解耦(注意此處的抽象和實現,並非抽象類和實現類的那種關係,而是一種角色的關係,這裡需要好好區分一下),可以使其獨立變化。在形如上例中,Pen只負責畫,但沒有形狀,它終究是不知道要畫什麼的,所以我們把它叫做抽象化角色;而Shape是具體的形狀,我們把它叫做實現化角色。抽象化角色和實現化角色是解耦的,這也就意味著,所謂的橋,就是抽象化角色的抽象類和實現化角色的抽象類之間的引用關係。
三、橋樑模式的優點和應用場景
優點:
1、抽象角色與實現角色相分離,二者可以獨立設計,不受約束;
2、擴充套件性強:抽象角色和實現角色可以非常靈活地擴充套件。
應用場景:
1、不適用繼承或者原繼承關係中抽象類可能頻繁變動的情況,可以將原類進行拆分,拆成實現化角色和抽象化角色。例如本例中,若將形狀、粗細、繪畫樣式等屬於彙集在一個類中,一旦抽象類中有所變動,將造成巨大的風險;
2、重用性比較大的場景。比如開關控制邏輯的程式,開關就是抽象化角色,開關的形式有很多種,操作的實現化角色也有很多種,採用橋樑模式,(如當前例子)開關即可進行復用,整體會將設計的粒度減小。
四、橋樑模式的缺點
1、增加對系統理解的難度。