Object Oriented Design Principles (SOLID) - Dependency Inversion + TEMPLATE Pattern