A class should have one, and only one, reason to change. Example
A class should be open for extension, but closed for modification. Example
Derived classes must be substitutable for their base classes. Example
Many client-specific interfaces are better than one general-purpose interface. Example
Depend upon abstractions. Do not depend upon concretions. Example