← 模式
装饰器 (Decorator)
12345678910111213141516171819202122232425262728293031323334353637383940414243 | class foo { public: virtual void do_work() = 0; }; class foo_concrete : public foo { public: virtual void do_work() override { } }; class foo_decorator : public foo { public: foo_decorator(foo& f) : f(f) { } virtual void do_work() override { // 在此处执行其他操作来装饰 // do_work 函数 f.do_work(); } private: foo& f; }; void bar(foo& f) { f.do_work(); } int main() { foo_concrete f; foo_decorator decorated_f{f}; bar(decorated_f); } |
此模式采用 CC0 公共领域贡献 许可。
要求 c++98 或更新版本。
意图
扩展一个类的功能。
描述
在 第 7-12 行,我们定义了希望被装饰的类 foo_concrete
,它实现了 foo
接口。
在 第 14-29 行 的 foo_decorator
类也实现了 foo
接口。这个装饰器类包装了任何其他的 foo
对象,并将任何调用转发给被包装的对象。通过在 foo_decorator::do_work
(第 21-25 行)中添加额外的代码,我们可以扩展被包装对象的功能。
为了演示,我们在 第 38-39 行 用 foo_decorator
包装了一个 foo_concrete
对象,并在 第 41 行 将它传递给 bar
函数。该函数接受任何 foo
对象的引用并调用其 do_work
方法。在这种情况下,该调用将被 foo_decorator
装饰。