#include <iostream>
using namespace std;
class phone
{
public:
virtual void ShowDecorator() = 0;//基类定义接口,在派生类中实现,使装饰类使用多态的特性增加功能
virtual ~phone() {};
};
class iPhone : public phone
{
public:
iPhone(string name):m_name(name) {};
void ShowDecorator() { cout << "my" << m_name << endl;};
private:
string m_name;
};
class Decorator : public phone
{
public:
Decorator(phone *phone):m_phone(phone) {};
virtual void DecoratorShow() {m_phone->ShowDecorator();}; //将私有成员的方法封装起来
virtual ~Decorator() {};
private:
phone *m_phone;//装饰基类中需要保存组件基类的指针:可以在完成装饰前后调用被装饰者的基本方法
};
class DecoratorA : public Decorator
{
public:
DecoratorA(phone *phone):Decorator(phone) {};
void ShowDecorator()
{
AddDec(); //在之前增加功能
Decorator::DecoratorShow(); //这里调用被修饰的组件的基本功能
AddDec(); //在之后增加功能);
}
protected:
void AddDec()
{
cout << "增加外壳" << endl;
}
};
class DecoratorB : public Decorator
{
public:
DecoratorB(phone *phone):Decorator(phone) {};
void ShowDecorator()
{
AddDec(); //在之前增加功能
Decorator::DecoratorShow(); //这里调用被修饰的组件的基本功能
AddDec(); //在之后增加功能
}
protected:
void AddDec()
{
cout << "增加贴纸" << endl;
}
};
int main()
{
phone *pIPhone = new iPhone("iphone 4s");
phone *pDa = new DecoratorA(pIPhone);
phone *pDb = new DecoratorB(pDa);
pDb->ShowDecorator();
delete pDb;
delete pDa;
delete pIPhone;
return 0;
}
装饰者模式
最新推荐文章于 2024-05-15 14:25:03 发布