SOLID Design Principles with Realtime Java Examples