Identify the aspects of your app that vary and separate them from what stays the same.
Favor composition over inheritance.
Program to an interface, not an implementation.
Loosely coupled designs allow us to build flexible object oriented systems that can handle change because they minimize the inter-dependency between objects.
Classes should be open for extensions, but closed for modifications.
Depend upon abstractions. Do not depend upon concrete classes.