此为大话设计模式decorator的c++版本
/*
* decorator.cpp
*
* Created on: Jul 19, 2017
* Author: clh01s@163.com
* 装饰模式
*/
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(){};
Person(string name)
{
_name = name;
}
virtual void show()
{
cout<<"装扮的"<<_name<<endl;
}
virtual ~Person(){}
private:
string _name;
};
class Finery:public Person
{
public:
void Decorate(Person *component)
{
_component = component;
}
void show() override
{
if(NULL != _component)
{
_component->show();
}
}
protected:
Person *_component;
};
class TShirts:public Finery
{
public:
void show() override
{
string ts = "大T恤";
cout<<ts<<endl;
//调用基类的show函数
Finery::show();
}
};
class BigTrouser:public Finery
{
public:
void show() override
{
string bt = "垮裤";
cout<<bt<<endl;
Finery::show();
}
};
class Shoes:public Finery
{
public:
void show() override
{
string s = "板鞋";
cout<<s<<endl;
Finery::show();
}
};
int main()
{
Person *tony = new Person("tony");
cout<<"装扮一:"<<endl;
TShirts *t = new TShirts();
BigTrouser *b = new BigTrouser();
Shoes *s =new Shoes();
/*所有的装饰都是在前一个装饰的基础上进行叠加
*下一个调用都将前一个对象当做参数传入至Decorate函数中
*/
t->Decorate(tony);
b->Decorate(t);
s->Decorate(b);
s->show();
return 0;
}
运行结果:
装扮一:
板鞋
垮裤
大T恤
装扮的tony
装饰模式优点:(摘抄于《设计模式》)
1.比静态集成更灵活 与对象的静态集成相比,decorator模式提供了更加灵活的向对象添加职责的方式.可以用添加和分离的方法,用装饰在运行时刻增加和删除职责.相比之下,继承机制要求为每个添加的职责创建一个新的子类.这回增加系统的复杂度.
2.避免在层次结构高层的类有太多的特征 decorator提供了一宗即用即付的方法来添加职责.它并不试图在一个复杂的可定制的类中支持所有可预见的的特征,相反你可以定义一个简单的类并且用decotator给它组件给它添加功能.可以从简单的部件组合出复杂的功能.这样,应用程序不必为不需要的特征付出代价.
缺点:
1.decorator与它的compoent不一样 decorator是一个透明的包装.如果我们从对象标识的观点出发,一个被装饰的组件与这个组件是有差别的,因此使用装饰时不应该依赖对象标识.
2.有许多小对象 采用decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们互相链接的方式上有所不同,而不是他们的类或是他们的属性值有所不同.尽管对于那些了解这些系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难.
转载请注明源地址:http://blog.csdn.net/clh01s/article/details/75460478