3.1 Adapter

Often, when designing complex systems, you will run into a scenario where you have a number of types that are similar, but not exactly the same. To further complicate matters, you will often need to treat all of these similar types the same way, but they may not share a common base type (super class or protocol). In these scenarios, we can take advantage of the adapter pattern to "wrap" existing instances in a common interface to treat them all the same.