Every class should have a single responsibility
Software entities (classes, functions, etc.) should be open for extension but closed for modification
Implementation is extended through inheritance
Object in a program should be replaceable with an instance of subtypes without affecting program correctness
Not substitutable
Substitutable
Many client-specific interfaces are better than one general-purpose interface
A client should not be forced to depend on methods it does not use
Original Interface
General Interface
Multiple Specific Interfaces
Depend upon abstractions, not concretions
Traditional Layered Architecture (violates principle)
Ownership Inversion (upholds principle)