【設計模式與遊戲完美開發】裝飾模式

與訪問者模式類似的做法,區別是訪問者的訪問人數和類型 以及 要對被訪問者做的事情 與裝飾者不同。

相同點:它們都擁有第三方(被訪問者/被裝飾者)通過聚合形式參與到(訪問者/裝飾者)進來

不同點:

1. 被裝飾者只允許一個進入裝飾者類,而被訪問者可以有多個進入訪問者類;

2. 裝飾者與被裝飾者的基類相同(同一類羣),而訪問者與被訪問者的基類不相同(非同一類羣)

3. 裝飾者必定會調用被裝飾者的功能,在此前提下進行附加其他功能,而訪問者是沒有此條約束的。

舉例說明:

原有類Sphere(繪圖圓形類)繼承於IShape接口,IShape內有Draw()接口方法,Sphere實現Draw接口方法。

在Sphere已經編寫好代碼之後,突然有一天策劃心血來潮說,繪圖圓形之後能不能再畫出一個矩形包囊住畫出來的圓形?

如果不破壞原有類Sphere內部的情況下,你需要再創一個類似Sphere的類,完全重寫它的功能來實現策劃的需求。

如果策劃想在上面所說的需求上再加個在圓形中間畫個等邊三角形,那又得新創一個類,完全重寫它的功能,此時發現只要策劃每次要在某個基礎上新增功能時,我們就得新建一個類,當需求越來越多時,類也會隨之變多,項目就越發難以維護。

此時就需要裝飾模式來解決這個問題,在原有類Sphere的功能基礎上,附加新的功能(畫個矩形包囊圓形)。

那就是新建一個裝飾器SphereDecorator 繼承於IShape,內有IShape sphere成員,實現Draw接口方法;

Draw接口方法如下:

void Draw(){
  sphere.Draw();

  //TODO畫個矩形包囊圓形(新功能)
}

外部用法:

SphereDecorator sphereDecorator = new SphereDecorator()
Sphere sphere = new Sphere()
sphereDecorator.SetSphere(sphere);
sphereDecorator.Draw();

面對策劃在(圓形外加個矩形)基礎上,再新增畫個三角形在圓形內部的需求,我們只需修改SphereDecorator的Draw即可

void Draw(){
  sphere.Draw();

  //TODO畫個矩形包囊圓形(新功能1)
  //TODO在圓形內畫個三角形(新功能2)
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章