在C++中,装饰器模式是一种设计模式,它允许用户通过创建一个包含现有对象的包装对象来扩展对象的行为,而无需修改现有的代码。装饰器模式可以在运行时实现,也可以在编译时实现。本文将介绍如何在编译时实现装饰器模式。
装饰器模式是一种结构型设计模式,它动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
在运行时实现装饰器模式时,通常会有一个接口或基类,然后创建多个继承自该接口或基类的装饰器类。下面是一个简单的运行时装饰器模式的示例:
class IceCream {
public:
    virtual void addBall() = 0;
    virtual void removeBall() = 0;
    virtual void print() = 0;
};
class VanillaIceCream : public IceCream {
public:
    void print() override {
        std::cout << "Vanilla Ice Cream" << std::endl;
    }
};
class SprinklesDecorator : public IceCream {
private:
    IceCream* iceCream;
public:
    SprinklesDecorator(IceCream* baseIceCream) : iceCream(baseIceCream) {}
    void print() override {
        iceCream->print();
        std::cout << "With Sprinkles" << std::endl;
    }
};
    
在这个例子中,有一个基础的冰淇淋类`IceCream`,然后创建了一个装饰器类`SprinklesDecorator`,它包装了`IceCream`对象,并添加了洒上糖珠的行为。
在C++中,可以使用模板和继承来在编译时实现装饰器模式。这种方式可以减少运行时的开销,并且可以更灵活地组合装饰器。
class Base {
public:
    virtual void func() = 0;
};
template 
class BasicDecorator : public T {
public:
    void func() override {
        T::func();
        std::cout << "BasicDecorator added behavior" << std::endl;
    }
};
     
在这个编译时装饰器的例子中,定义了一个基础类`Base`,然后创建了一个模板类`BasicDecorator`,它继承自任意的`Base`派生类。`BasicDecorator`类重写了`func`方法,并添加了额外的行为。
如果想要给一个类添加多个装饰器,可以使用变长模板参数来实现。下面是一个支持多个装饰器组合的示例:
template 
class AdvancedDecorator : public Decorators... {
public:
    void func() override {
        (Decorators::func(), ...);
        std::cout << "AdvancedDecorator combined behavior" << std::endl;
    }
};