Source: https://courses.cs.duke.edu/spring22/compsci308/readings/design-patterns-explained-ch05.pdf