The decorator pattern
The decorator pattern allows us to add behaviors to objects without changing their structure or inheritance chain. Instead of subclassing, decorators enhance an object's behavior by adding functionalities to it.
Unlike with inheritance, where the chain is directional, the decorator pattern allows for composing behaviors without regard to a particular execution order.
In this section, we'll explain the implementation details of the decorator pattern through the example of assembling a burger to your taste.
Using a decorator
The decorator pattern is extremely powerful when assembling a series of objects together. We'll use a burger as an example, from the point of view of the cashier who processes and bills it.
First, let's define a basic protocol, which will encapsulate the price and the different ingredients in the current burger. In the decorator pattern, this protocol will represent the object that will be decorated over and over:
public protocol Burger { var price...