1.裝飾模式概述
1.1、意圖
動態的給一個對象添加一些額外的職責。就增加功能來說,Decorate模式相比生成子類更爲靈活。
1.2、適用性
- 在不影響其他對象的情況下,以動態,透明的方式給單個對象添加職責。
- 處理那些可以撤銷的職責。
- 當不能採用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,爲支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況是因爲類定義被隱藏,或類定義不能用於生成子類。
1.3、結構圖
- component爲一個對象接口,ConcreteComponent爲具體對象類。
- Decorate類爲裝飾類接口,有一個指向Component對象的指針。
- ConcreteDecorator爲具體裝飾類,向組件添加職責。
2.代碼示例
//Component
class Pizza {
public:
virtual void name() = 0;
};
//ConcreteComponentA
class ZunBaoPizza : public Pizza {
public:
virtual void name() {
std::cout << "尊寶";
}
};
//ConcreteComponentB
class BiShengKePizza : public Pizza {
public:
virtual void name() {
std::cout << "必勝客";
}
};
//Decorator
class Decorate : public Pizza {
public:
Decorate(Pizza *pizza):m_pPizza(pizza){}
virtual void name() {
m_pPizza->name();
}
protected:
Pizza *m_pPizza;
};
//ConcreteDecoratorA
class BeefDecorate : public Decorate {
public:
BeefDecorate(Pizza *pizza):Decorate(pizza) {}
virtual void name() {
std::cout << "牛肉";
Decorate::name();
}
};
//ConcreteDecoratorB
class ChickenDecorate : public Decorate {
public:
ChickenDecorate(Pizza *pizza):Decorate(pizza) {}
virtual void name() {
std::cout << "雞肉";
Decorate::name();
}
};
int main()
{
ZunBaoPizza *zunbao = new ZunBaoPizza();
Pizza *pizza1 = new BeefDecorate(zunbao);
pizza1->name();
std::cout << std::endl;
Pizza *pizza2 = new ChickenDecorate(zunbao);
pizza2->name();
std::cout << std::endl;
system("pause");
return 0;
}
輸出結果: