C++23種設計模式(四)--Decorate(裝飾模式)

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;
}

輸出結果:
在這裏插入圖片描述

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