装饰模式
使用
当我们需要在一个类中增加一定的功能时候,常常想到增加子类扩展功能,但如果需要给5个同级类增加相同的功能,就需要写5个子类。而在基类上进行修改增加功能不但混淆了核心功能更违背了开闭原则,这时候就需要使用装饰模式
概念
动态的给一些对象增添一些职责,就增加功能来说,装饰模式比增加子类更灵活。它把每个要装饰的功能放在单独的类中,并让这个类包装所要装饰的对象,当需要执行特殊行为时候,客户代码就可以根据运行情况有选择灵活地包装对象。
优点
1 动态扩展,而不需要是把装饰功能从类中移除,就可以还原原有的类
2 有效的把类的核心职责和装饰的职责区分开。
3 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
UML
代码
#include<iostream>
using namespace std;
//抽象接口
class Component
{
public:
Component() {};
~Component() {};
virtual void Operation() {};
private:
};
//添加装饰的对象实例
class ConcreatComponent :public Component
{
public:
ConcreatComponent() {};
~ConcreatComponent() {};
void Operation() { cout << "核心职责" << endl; };
private:
};
//装饰抽象类
class Decorator :public Component
{
public:
Component *component;
Decorator() {};
~Decorator() {};
void setComponent(Component* c) { component = c; };
void Operation() { component->Operation(); };
private:
};
//装饰对象A
class ConcreatDecoratorA :public Decorator
{
public:
ConcreatDecoratorA() {};
~ConcreatDecoratorA() {};
void Operation() { Decorator::Operation(); cout << "添加A功能" << endl;}
private:
};
//装饰对象B
class ConcreatDecoratorB :public Decorator
{
public:
ConcreatDecoratorB() {};
~ConcreatDecoratorB() {};
void Operation() { Decorator::Operation(); cout << "添加B功能" << endl;}
private:
};
int main()
{
ConcreatComponent *component = new ConcreatComponent();
ConcreatDecoratorA *A = new ConcreatDecoratorA();
ConcreatDecoratorB *B = new ConcreatDecoratorB();
A->setComponent(component);
B->setComponent(A);
B->Operation();
getchar();
//结果
//核心职责
//添加A功能
//添加B功能
}