Decorator:
Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to sub-classing for extending functionality.
Principles:
Classes should be open for extension, but closed for modification. (Decorator pattern)
Composition and delegation can often be used to add new behaviors at runtime.
Class diagram:
(1)Given that the decorator has the same supertype as the object it decorates, we can pass around a decorated object in place of the original (wrappedd) object.
(2)The decorator adds its own behavior either before and/or after delegating to the object it decorates to do the rest of the job.
(3)Decorate objects dynamically at runtime.
(4)If you have code that relies on the concrete component's type, decorators will break that code.
(5)Decorators are typically created by using other patterns like Factory and Builder.