前言
装饰:从字面的意思看就知道这是一个使一个类更加强大的方法。就好比装修房子一样,装饰之后才更加完美。但是可能会有一个疑问,想使一个类更加强大,直接增加类的方法不就可以了吗?为什么还要搞什么装饰模式这样的东西?但这样就违背了设计基本原则--开放封闭原则。我们不想改变原有对象结构的情况下,动态的给对象增加额外的功能或者职责,这就是装饰模式。装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。下面可以看出装饰类和被装饰的类的关系是聚合关系,相互可独立。
主要实现:
对一个类的功能进行扩展,其实说白了就是咱们小学学习的扩展句子。比如:“打电话”这个功能。具体实例为“使用魅族手机打电话”,装饰一下。“戴着耳机用魅族手机打电话”,再装饰一下,“我用耳机使用魅族手机打电话”。这样扩展之后,就可以根据自己需要来选择使用哪些具体的实例。
#include <iostream>
using namespace std;
class Phone
{
public:
virtual void call()
{
cout << "call" << endl;
}
};
class MeiZu:public Phone
{
public:
virtual void call()
{
cout << "Use MeiZu Phone call" << endl;
}
};
class Decorator :public MeiZu
{
protected:
MeiZu *meizu;
public:
void decorat(MeiZu *meizu)
{
this->meizu = meizu;
}
void call()
{
meizu->call();
}
};
class Earphone :public Decorator
{
public:
void call()
{
cout << "use earphone call" << endl;
meizu->call();
}
};
class Someone :public Decorator
{
public:
void call()
{
cout << "some one will call" << endl;
meizu->call();
}
};
int main()
{
MeiZu *mei = new MeiZu();
Decorator *dec = new Decorator();
dec->decorat(mei);
Someone *som = new Someone();
som->decorat(dec);
Earphone *ear = new Earphone();
ear->decorat(som);
ear->call();
return 0;
}
一点解释:
1、装饰器模式,肯定有个装饰类,以上代码中就是Decorator ,是继承Meizu的,其他需要装饰的类就是继承这个装饰的类的Decorator 。
2、最后一条ear->call 首先会调用Earphone中的call,由于ear装饰了Someone类的实例som,所以会调用Someone的call,实例som又装饰了Decorator的实例dec,所以,又会调用Decorator的call,层层递进,实现装饰。