Source: https://monge.univ-mlv.fr/ens/Master/M1/2018-2019/POO-DesignPatterns/cours/2-DP-A-intro.pdf