装饰器模式用来给一个对象动态的添加额外功能,是继承的一种替代模式。它比继承更为灵活,有时我们希望只给某个对象添加功能,而不是整个类添加功能。
实现:将需要装饰的对象嵌入装饰器中,由装饰器添加额外的功能。、
注意:装饰器应该与被装饰类的接口一致,以做到对用户透明。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <map>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <queue>
#include <vector>
#define MS(a,b) memset(a,b,sizeof(a))
#define LL long long
using namespace std;
const int N = 1011;
class phone
{
public:
virtual void show()=0;
virtual int get()=0;
};
class iphone: public phone
{
private:
int price;
public:
iphone(int x=1000):price(x){}
void show()
{
cout<<"this is a iphone"<<endl;
}
int get() {return price;}
};
class decoratorPhone: public phone
{
private:
phone *p;
public:
decoratorPhone(phone *ptr):p(ptr) {}
void show()
{
p->show();
}
int get()
{
p->get();
}
};
class addDecortor1:public decoratorPhone
{
public:
addDecortor1(phone *ptr):decoratorPhone(ptr) {}
void show()
{
int price = get();
if (price >1000) { cout<<"oh my god! so chear"<<endl; }
decoratorPhone::show();
}
};
class addDecortor2:public decoratorPhone
{
public:
addDecortor2(phone *ptr):decoratorPhone(ptr) {}
void show()
{
int price = get();
if (price >1000) { cout<<"are you crazy ?"<<endl; }
decoratorPhone::show();
}
};
int main()
{
iphone *p = new iphone(2000);
addDecortor1 *dec1= new addDecortor1(p);
dec1->show();
addDecortor2 *dec2= new addDecortor2(p);
dec2->show();
addDecortor2 *dec3= new addDecortor2(dec1);
dec3->show();
}