https://medium.com/javarevisited/top-behavioral-design-patterns-with-real-examples-in-java-bcb1635bf90a