設計模式(十五)裝飾模式 C++

意圖:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。

好處就是把核心功能和裝飾功能區分開來了

(要想真正理解裝飾模式的代碼實現,首先要理解多態的實現)

裝飾模式主要包含以下角色。

  1. 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象。
  2. 具體構件(Concrete    Component)角色:實現抽象構件,通過裝飾角色爲其添加一些職責。
  3. 抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的實例,可以通過其子類擴展具體構件的功能。
  4. 具體裝飾(ConcreteDecorator)角色:實現抽象裝飾的相關方法,並給具體構件對象添加附加的責任。

    在下面的demo中,手機作爲抽象構件,iPhone 和Nokia 作爲具體構件,DecoratorPhone作爲抽象裝飾,

DecoratorPhoneA,DecoratorPhoneB作爲具體裝飾,一個代表掛件,一個代碼貼膜。

裝飾模式的技術思想是:通過多態性調用各個裝飾

 

 

#include <iostream>
#include <windows.h>
using namespace std;

//公共抽象類
class Phone
{
public:
	Phone()
	{}
	virtual ~Phone() 
	{}
	virtual void ShowDecorate() 
	{}
};

//具體的手機類
class iPhone : public Phone
{
private:
	string m_name; //手機名稱
public:
	iPhone(string name) : m_name(name)
	{}
	~iPhone() 
	{}
	void ShowDecorate()
	{ 
		cout << m_name.c_str() << "		的裝飾" << endl; 
	}
};

//具體的手機類
class NokiaPhone : public Phone
{
private:
	string m_name;
public:
	NokiaPhone(string name) : m_name(name) 
	{}
	~NokiaPhone()
	{}
	void ShowDecorate()
	{ 
		cout << m_name.c_str() << "		的裝飾" << endl;
	}
};

//裝飾類
class DecoratorPhone : public Phone
{

public:
	DecoratorPhone(Phone *phone) : m_phone(phone) 
	{}
	virtual void ShowDecorate() 
	{ 
		m_phone->ShowDecorate(); 
	}

private:
	Phone *m_phone;  //要裝飾的手機
};

//具體的裝飾類
class DecoratorPhoneA : public DecoratorPhone
{
public:
	DecoratorPhoneA(Phone *phone) : DecoratorPhone(phone)
	{}
	void ShowDecorate() 
	{ 
		DecoratorPhone::ShowDecorate();
		AddDecorate(); 
	}
private:
	//增加的裝飾
	void AddDecorate() 
	{ 
		cout <<		"增加掛件" << endl; 
	}
};

//具體的裝飾類
class DecoratorPhoneB : public DecoratorPhone
{
public:
	DecoratorPhoneB(Phone *phone) : DecoratorPhone(phone) {}
	void ShowDecorate() 
	{
		DecoratorPhone::ShowDecorate(); 

		AddDecorate(); 
	}
private:
	//增加的裝飾
	void AddDecorate() 
	{ 
		cout << "屏幕貼膜" << endl;
	} 
};

int main()
{
	Phone *pNokia = new NokiaPhone("Nokia6300");
	Phone *pPendant = new DecoratorPhoneA(pNokia); //裝飾,增加掛件
	Phone *pPatch = new DecoratorPhoneB(pPendant);    //裝飾,屏幕貼膜
	pPatch->ShowDecorate();

	delete pPendant;
	delete pPatch;
	delete pNokia;


	system("pause");
	return 0;
}

 

發佈了195 篇原創文章 · 獲贊 41 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章