装饰器模式又叫做包装模式。装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。是继承关系的一种替代方案。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。


类图如下:


示例代码如下:

#include <iostream>
using namespace std;

/* 被装饰抽象基类 */
class Component {
public:
    virtual void Operation() = 0;
    virtual ~Component() { }
};

/* 被装饰具体子类 */
class ConcreteComponent :public Component {
public:
	/* 此时子类只有一个Operation()操作 */
    void Operation() 
	{
        cout << "ConcreteComponent::Operation..." << endl;
    }
};

/* 抽象装饰器类 */
class Decorator {
public:
    virtual void Operation() = 0;
    virtual void AddBehavior() = 0;
    virtual ~Decorator() { }
};

/* 具体装饰器类 */
class ConcreteDecorator :public Decorator {
public:
    ConcreteDecorator(Component *com) 
	{
        _com = com;
    }

    void AddBehavior() 
	{
        cout << "ConcreteDecorator::AddBehavior..." << endl;
    }

	/* 在原有的功能基础上新加AddBehavior()操作 */
    void Operation() 
	{
        cout << "ConcreteDecorator::Operation..." << endl;
        AddBehavior();
        _com->Operation();
    }
private:
    Component *_com;
};

int main() {
    Component *con = new ConcreteComponent();
    Decorator *dec = new ConcreteDecorator(con);
    dec->Operation();

    delete con;
    delete dec;

	system("pause");
    return 0;
}

运行结果如下: