看了《大話設計模式》裏面的裝飾者模式。。。。。沒什麼大的感覺。就是不用繼承過多子類,免得引起子類大爆炸。而用另一個動態的方法來擴展這個類的功能
主要分爲 裝飾者和被裝飾者 ,被裝飾者呢就是要擴展功能的類,被裝飾者就是用來動態擴展被裝飾者功能的類
這裏寫個自己寫的。呵呵,。理解不夠徹底,例子將就着,多用幾次就有更深的理解了
還記得以前吹的泡泡吧。這裏寫了一個泡泡類 bubble
class bubble
{
public: void OutPut() {cout<< "泡泡" <<endl;}
};
這個時候生成的泡泡是沒什麼顏色的 但是如果我想要紅色的泡泡呢 可以繼承,但是我又需要藍色泡泡呢,沒錯,還是可以繼承 但是我要五顏六色的不同組合的泡泡呢,那樣繼承下來就可能造成很多個子類了,這個時候就可以用到裝飾者模式了,動態的給泡泡增加顏色,下面在寫一個 總泡泡類
class Mainbubble
{
public:
virtual void OutPut() {}
};
這樣將泡泡類繼承於這個類
class bubble:public Mainbubble
{
public:
void OutPut() {cout<< "泡泡" <<endl;}
};
再寫一個紅色類一個黑色類
class RedBubble:public Mainbubble
{
Mainbubble *MBubble;
public:
void SetBubble(Mainbubble *b){MBubble = b;}
void OutPut() {cout <<"紅色"; MBubble->OutPut();}
};
class BlaclBubble:public Mainbubble
{
Mainbubble *MBubble;
public:
void SetBubble(Mainbubble *b){MBubble = b;}
void OutPut() {cout <<"黑色"; MBubble->OutPut();}
};
這樣一來 泡泡就可以用黑色和紅色來裝飾 不管是先紅色 還是先黑色
這裏是主函數代碼
int main()
{
Mainbubble *b = new bubble;
RedBubble *c = new RedBubble;
BlaclBubble *d = new BlaclBubble;
c->SetBubble(b);
d->SetBubble(c);
d->OutPut();
system("pause");
return 0;
}
輸出就是 紅色黑色泡泡 這樣不管怎麼組合 或者像添加新的,就只要添加新顏色 然後在進行組合就行了
當然可以從總泡泡類在繼承一個類 將函數SetBubble寫在裏面 然後添加顏色只需要繼承就行了。
本人初學。。。。所以代碼不怎麼的,理解也不怎麼的,嘿嘿。。。