装饰者模式
定义:
动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承者更有弹性的替代方案
设计原则:
类应该对扩展开放,对修改关闭
适用性:
动态的给已知的对象动态的添加额外的功能,但又不影响对象已有的功能。仅仅对增加子类来说,装饰者模式比继承生成子类更加灵活,原因是装饰者模式可以根据功能需要有用户动态决定加入的方式和时机,实现“即插即用”的功能,在运行时动态增加何种功能,通过继承生成子类是一种静态的事项方法。
实现:
1、装饰者和被装饰者有相同的超类型component类
2、装饰者中含有一个保护类型的component指针(这里用到的是组合模式)作为被装饰者类的数据成员。同时用component的指针作为自己的构造函数的参数。指针是protected的原因是:派生类继承之后就是他们的私有成员了
/*****************************************
使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
********************************************/
#include <iostream>
#include <stdio.h>
using namespace std;
//原始类
class Component
{
public:
Component(){}
virtual ~Component(){}
virtual double price() = 0;
};
//被装饰类,酒店房间
class Room:public Component
{
public:
Room(){}
virtual ~Room(){}
double price()
{
return 500;
}
};
//装饰者类
class Decorator:public Component
{
public:
Decorator(Component *com)
{
this->m_com = com;
}
virtual ~Decorator(){}
double price()
{
return this->m_com->price();
}
protected:
Component *m_com;//被装饰者
};
//旺季
class Hot:public Decorator
{
public:
Hot(Component *com):Decorator(com){}
virtual ~Hot(){}
double price()
{
return 100 + this->m_com->price();
}
};
//VIP
class VIP:public Decorator
{
public:
VIP(Component *com):Decorator(com){}
virtual ~VIP(){}
double price()
{
return -100 + this->m_com->price();
}
};
//service
class Service:public Decorator
{
public:
Service(Component *com):Decorator(com){}
virtual ~Service(){}
double price()
{
return 50 + this->m_com->price();
}
};
//travel
class Travel:public Decorator
{
public:
Travel(Component *com):Decorator(com){}
virtual ~Travel(){}
double price()
{
return -50 + this->m_com->price();
}
};
int main()
{
Room *r = new Room();
VIP *v = new VIP(r);
Travel *t = new Travel(v);
printf("price:%f\n",t->price());
delete r;
delete v;
delete t;
}