Source: https://www.emse.fr/~boissier/enseignement/aco/pdf/2.DesignPattern.MSGL.4pp.pdf