使用模板进行类装饰
当使用模板进行类装饰时,通常会使用继承和组合两种方式实现。其中,继承方式是通过继承一个基类来实现类的装饰,组合方式则是通过将一个类对象作为成员变量来实现类的装饰。
以下是一个使用组合方式实现类装饰的示例:
#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
```
可以看到,通过使用模板和组合技术,我们成功地实现了对类的装饰,并且在原来的基础上添加了两个额外的行为。
评论区