目 录CONTENT

文章目录

使用模板进行类装饰

WenzhouXv
2023-07-24 / 0 评论 / 0 点赞 / 49 阅读 / 0 字

使用模板进行类装饰

当使用模板进行类装饰时,通常会使用继承和组合两种方式实现。其中,继承方式是通过继承一个基类来实现类的装饰,组合方式则是通过将一个类对象作为成员变量来实现类的装饰。

以下是一个使用组合方式实现类装饰的示例:

#include <iostream>

// 原始类
class Component {
public:
    virtual void operation() {
        std::cout << "Component operation" << std::endl;
    }
};

// 装饰类
template <typename T>
class Decorator : public Component {
protected:
    T* component;
public:
    Decorator(T* component) : component(component) {}
    void operation() override {
        component->operation();
    }
};

// 具体装饰类1
class ConcreteDecorator1 : public Decorator<Component> {
public:
    ConcreteDecorator1(Component* component) : Decorator<Component>(component) {}
    void operation() override {
        Decorator<Component>::operation();
        addedBehavior();
    }
    void addedBehavior() {
        std::cout << "ConcreteDecorator1 added behavior" << std::endl;
    }
};

// 具体装饰类2
class ConcreteDecorator2 : public Decorator<Component> {
public:
    ConcreteDecorator2(Component* component) : Decorator<Component>(component) {}
    void operation() override {
        Decorator<Component>::operation();
        addedState();
    }
    void addedState() {
        std::cout << "ConcreteDecorator2 added state" << std::endl;
    }
};

int main() {
    // 创建原始对象
    Component* component = new Component();
    // 创建装饰对象1
    ConcreteDecorator1* decorator1 = new ConcreteDecorator1(component);
    // 创建装饰对象2
    ConcreteDecorator2* decorator2 = new ConcreteDecorator2(decorator1);

    // 调用操作函数
    decorator2->operation();

    // 释放内存
    delete component;
    delete decorator1;
    delete decorator2;

    return 0;
}

在上面的代码中,我们首先定义了原始类Component,然后定义了模板类Decorator作为装饰基类。在Decorator类中,我们定义了一个指向包含类对象的指针,并重新实现了operation()函数。

接着,我们定义了两个具体装饰类ConcreteDecorator1和ConcreteDecorator2,它们分别通过继承自Decorator和Decorator来实现对Component和ConcreteDecorator1类的装饰。

最后,在main()函数中,我们首先创建了一个原始对象component,然后创建了两个装饰类对象decorator1和decorator2,并将其按照顺序进行组合。最后,我们调用decorator2->operation()函数来触发整个装饰器链条的执行,输出结果如下:

    Component operation
ConcreteDecorator1 added behavior
ConcreteDecorator2 added state

    ```
    可以看到,通过使用模板和组合技术,我们成功地实现了对类的装饰,并且在原来的基础上添加了两个额外的行为。
0
c++
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区