Encapsulate what varies

Favor composition  over inheritance

Program to interfaces, not implementations

Strive for loosely coupled designs between objects that interact

Classes should be open for extension but closed for modification

Depend on abstractions.  Do not depend on concrete classes