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!