裝飾模式
1. 裝飾模式:需要把所需的功能按正確的順序串聯起來進行控制。
爲已有功能動態添加更多功能的一種方式。
2.解釋說明:
在起初設計中,當系統需要新功能時,是向舊的類中添加新的代碼,而裝飾模式把每個要裝飾的功能放在單獨的類中,並讓這個類包裝它所要裝飾的對象,裝飾的執行順序也可以隨意搭配,就可以以任意的順序搭配穿衣服次序。可以褲子-上衣的順序,也可以上衣-褲子的順序。
3.代碼示例:
Person定義了一個對象接口,可以給這些對象動態的添加職責。
Finery,修飾了抽象類,繼承了Person,從外類來擴展Person類的功能。但對於Person類來說,是無需知道Finery的存在的。
至於TShirts和BigTrouser就是具體的操作對象,起到給Person添加職責的功能。
#include <string>
#include <iostream>
using namespace std;
class Person
{
private:
string m_strName;
public:
Person(string strName)
{
m_strName=strName;
}
Person(){}
virtual void show()
{
cout<<"裝扮的是:"<<m_strName<<endl;
}
};
class Finery:public Person
{
protected:
Person *m_component;
public:
void decorate(Person* component)
{
m_component=component;
}
virtual void show()
{
m_component->show();
}
};
class TShirts:public Finery
{
public:
virtual void show()
{
m_component->show();
cout<<"T shirts"<<endl;
}
};
class BigTrouser:public Finery
{
public:
virtual void show()
{
m_component->show();
cout<<"Big Trouser"<<endl;
}
};
int main()
{
Person *p=new Person("小李");
BigTrouser *bt=new BigTrouser();
TShirts *ts=new TShirts();
bt->decorate(p); //裝飾的方法:首相實例化對象p;
ts->decorate(bt);//然後用BigTrouser實例化的對象bt裝飾p;
ts->show(); //再用TShirts實例化的對象ts包裝bt;
return 0;
}