โ† Patterns

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 something else here to decorate // the do_work function 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); }

This pattern is licensed under the CC0 Public Domain Dedication.

Requires c++98 or newer.

Intent

Extend the functionality of a class.

Description

On lines 7โ€“12, we define the class that we wish to decorate, foo_concrete, which implements the foo interface.

The foo_decorator class, on lines 14โ€“29, also implements the foo interface. This decorator class wraps any other foo object, and forwarding any calls to the wrapped object. By adding additional code to foo_decorator::do_work (lines 21โ€“25), we can extend the functionality of the wrapped object.

To demonstrate, we wrap a foo_concrete with a foo_decorator on lines 38โ€“39, and pass it to the bar function on line 41, which takes a reference to any foo object and calls do_work on it. In this case, the call will be decorated by foo_decorator.

Contributors

  • Joseph Mansfield
  • Robbie Shade

Last Updated

09 December 2017

Source

Fork this pattern on GitHub

Share