← 模式

装饰器 (Decorator)

12345678910111213141516171819202122232425262728293031323334353637383940414243class 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 装饰。

贡献者

  • Joseph Mansfield
  • Robbie Shade

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享