The decorator pattern 'decorates' additional functionality to an object during runtime.
This is in line with the Open-Closed Principle, as the original code does not need to be changed.

The decorator pattern is a structural pattern, and prefers a composition of an inheritance of its class.
Through this we can decorate an object multiple times - A(A(A(A(A(B)))))

For example, adding extra cost (ie +50 cents) to an object that has a cost attribute