This pattern is licensed under the CC0 Public Domain Dedication.
Extend the functionality of a class.
On lines 7–12, we define the class that we wish to decorate,
foo_concrete, which implements the
foo_decorator class, on lines 14–29, also implements the
foo interface. This decorator class wraps any other
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
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