The decorator design pattern uses an interface to add functionality to a class without extending it. Another name for ‘adding functionality’ is ‘decorating’. You can spot a decorator because it implements an interface and accepts the same interface in its constructor.
class MyDecorator implements MyInterface { private MyInterface my_interface public construct(MyInterface my_interface) { this.my_interface = my_interface } public doWork() { this.my_interface.doWork() this.doAdditionalWork() } }
MyDecorator
decorates any MyInterface
implementation with this.doAdditionalWork()
, while also doing the original work with this.my_interface.doWork()
.
Anywhere the interface is referenced, the decorator can be used, so additional work can be added without class extension and without modifying any calling code.
Behold the power of interfaces!