設計模式之裝飾模式

裝飾模式

 

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;
}
發佈了10 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章