Source: https://tabard.fr/courses/2017/mif01/M1if01-C5-DesignPatterns.pdf