1. 程式人生 > >11-Python與設計模式--橋樑模式

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是具體的形狀,我們把它叫做實現化角色。抽象化角色和實現化角色是解耦的,這也就意味著,所謂的橋,就是抽象化角色的抽象類和實現化角色的抽象類之間的引用關係。


f1.png

三、橋樑模式的優點和應用場景

優點:

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

應用場景:

1、不適用繼承或者原繼承關係中抽象類可能頻繁變動的情況,可以將原類進行拆分,拆成實現化角色和抽象化角色。例如本例中,若將形狀、粗細、繪畫樣式等屬於彙集在一個類中,一旦抽象類中有所變動,將造成巨大的風險;
2、重用性比較大的場景。比如開關控制邏輯的程式,開關就是抽象化角色,開關的形式有很多種,操作的實現化角色也有很多種,採用橋樑模式,(如當前例子)開關即可進行復用,整體會將設計的粒度減小。

四、橋樑模式的缺點

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