先從裝飾者模式的由來來講起
如果我們要做乙個遊戲中的角色,要新增**,鞋子,衣服等等,最簡單的設計方法
方案1:
class hero
;class hero : public component
};void equipdecorator::euip()
}/*下面為子類*/
class shirt : public equipdecorator //襯衣
; virtual void euip();
};
void shirt :: euip()
class weapons : public equipdecorator //**
; virtual void euip();
};void weapons ::euip()
class shoes : public equipdecorator //鞋子
; virtual void euip();
};
void shoes ::euip()
一口氣看完,有點沒看懂沒關係,等一下再解釋,所以客戶端的呼叫是這樣的
//建立基本物件
hero person("li");
shirt shirt("白色");
weapons weapons("100");
shoes shoes("20");
shirt.decprate(&person); //裝飾主角
weapons.decprate(&shirt); //裝飾裝好shirt主角
shoes.decprate(&weapons); //裝飾裝好shirt和**的主角
shoes.euip(); //顯示出來
結果
這個時候肯定有點蒙,所以最好的是理清思路,跟著**走一遍
hero person("li");
shirt shirt("白色");
weapons weapons("100");
shoes shoes("20");
這裡建立主要注意的就是要先構造他自己的基類的比較簡單
接下來是
shirt.decprate(&person);//裝飾主角
weapons.decprate(&shirt); //裝飾裝好shirt主角
shoes.decprate(&weapons); //裝飾裝好shirt和**的主角
這個是重點了。
shoes.euip();
流程為:
1. shoes.euip();
2. equipdecorator::euip();
3. pcomponet->euip();(pcompnet為weapons的指標,在之前的decprate()儲存下來的)
4. 繼續執行2.
5. 執行3.pcomponet->euip();(pcompnet為shirt的指標)
6. 繼續執行2.
7. 執行3.pcomponet->euip();(pcompnet為hero的指標)
8. 呼叫到了終點hero的euip
void hero::euip()
9. 結束7的呼叫,回到shirt的euip
void shirt :: euip()
再一層層的向回走,把所有的新增的都輸出一遍
好處和作用引用一下別人的
裝飾者模式
意圖:
動態地給乙個物件新增一些額外的職責。就增加功能來說,decorator模式相比生成子類更為靈活。
設計原則:
1. 多用組合,少用繼承。
利用繼承設計子類的行為,是在編譯時靜態決定的,而且所有的子類都會繼承到相同的行為。然而,如果能夠利用組合的做法擴充套件物件的行為,就可以在執行時動態地進行擴充套件。
2. 類應設計的對擴充套件開放,對修改關閉。
要點:
1. 裝飾者和被裝飾物件有相同的超型別。
2. 可以用乙個或多個裝飾者包裝乙個物件。
3. 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。
4. 物件可以在任何時候被裝飾,所以可以在執行時動態的,不限量的用你喜歡的裝飾者來裝飾物件。
5. 裝飾模式中使用繼承的關鍵是想達到裝飾者和被裝飾物件的型別匹配,而不是獲得其行為。
6. 裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別。在實際專案中可以根據需要為裝飾者新增新的行為,做到「半透明」裝飾者。
7. 介面卡模式的用意是改變物件的介面而不一定改變物件的效能,而裝飾模式的用意是保持介面並增加物件的職責。
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...