This Project is an example for how SOLID Principle is applied in Java.
S -> Single Responsibility Principle (SRP)
O -> Open and Close Principle (OCP)
L -> Liskov's Substitution Principle (LSP)
I -> Interface Segregation Principle (ISP)
D -> Dependency Inversion Principle (DIP)
These principle are explained in an article posted in Medium.com published under javarevisited.
https://medium.com/javarevisited/solid-principle-explained-de634c6a754