In the GoF patterns book, we see a few principles repeated
again and again. These principles shape the pattern design
and intent in most of the patterns we will study. They are:
Program to an interface, not an implementation
Favor object composition (delegation) over class
inheritance
Consider what should be variable in your design:
encapsulate the concepts that vary