意圖:動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更爲靈活。
好處就是把核心功能和裝飾功能區分開來了
(要想真正理解裝飾模式的代碼實現,首先要理解多態的實現)
裝飾模式主要包含以下角色。
- 抽象構件(Component)角色:定義一個抽象接口以規範準備接收附加責任的對象。
- 具體構件(Concrete Component)角色:實現抽象構件,通過裝飾角色爲其添加一些職責。
- 抽象裝飾(Decorator)角色:繼承抽象構件,幷包含具體構件的實例,可以通過其子類擴展具體構件的功能。
- 具體裝飾(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;
}