GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • C++Patterns

This view

  • Original page
  • New address

GeezerVison is showing cpppatterns.com — Decorator - C++ Patterns

← 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

Last Updated

09 December 2017

Source

Fork this pattern on GitHub

Share

Tweet

You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.