装饰模式C++实现
1定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更加灵活、可作为继承的替代
2类图
3实现
//构件
class Component
{
protected:
Component();
public:
virtual void operate() = 0;
virtual ~Component() = 0;
};
class ConcreteComponent: public Component
{
public:
ConcreteComponent();
~ConcreteComponent();
void operate()
{
cout << " do Something..."<<endl;
}
};
//注,这里的继承很关键,因为客户端只是知道Component,而不知Decorator,这样做提供了多态表示的机会
class Decorator:public Component
{
private:
Component *_com;
public:
Decorator(Component* com)
:_com(com)
{}
void operate()
{
_com->operate();
}
};
class ConcreteDecorator:public Decorator
{
public:
ConcreteDecorator(Component *com)
:Decorator(com)
{}
private:
void method1()
{
cout << "装饰1"<<endl;
}
void operate()
{
method1();
Decorator::operate();
}
};
void Test
{
component *com = new ConcreteComponent();
com = new ConcreteDecorator(com);
com.operate();
};
4应用
①优点
装饰类和被装饰类可以独立发展,不会有耦合关系。Decorator是从外部扩展功能,而不知道具体的构建
装饰模式是继承关系的一个替代方案。实现的是is-a关系(注解继承)
可以动态的扩展一个类的功能
②缺点
多层装饰会有无限剥离的问题,影响效率,性能,工作量大
5使用场景
需要扩展一个类的功能,附加功能
需要动态给一个对象增加功能,且可以再动态撤销
需要为一批兄弟类进行改装或加装功能,首选装饰功能
6辨析
继承时静态增加功能
装饰是动态增加功能