1. Open Close Principle
Software entities like classes, modules and functions should be open for extension but closed for modifications.
2. Dependency Inversion
High-level modules should not depend on low-level modules. Both should depend on abstractions.
Abstractions should not depend on details. Details should depend on abstractions
3. Interface Segregation
Clients should not be forced to depend upon interfaces that they don't use.
4. Single Responsibility
A class should have only one reason to change.