装饰器与适配器模式:C++ 中的灵活设计实践
1. 装饰器模式基础与注意事项
在实现装饰器时,要避免意外改变基类的行为。例如,下面这个 DebugDecorator 的实现就存在微妙的问题:
template <typename U> class DebugDecorator : public U {
double attack() {
cout << "Attack: " << U::attack() << endl;
return U::attack();
}
};
这里的问题在于,装饰后的对象除了预期的打印行为外,还隐藏了对基类 attack() 方法的两次调用,这可能导致打印值不准确,并且会取消一些一次性的攻击加成。
为了实现更可复用、通用的装饰器,我们可以利用 C++ 的模板机制。以下是一个使用可变参数模板、参数包和完美转发实现的通用调试装饰器:
// Example 07
template <typename Callable> class DebugDecorator {
public:
template <typename F>
DebugDecorator(F&& f, const char* s) :
c_(std::forward<F>(f)),
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



