Source: https://www.emse.fr/~picard/cours/2A/DesignPatterns.pdf