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

A class should have only one reason to change

High cohesion – designed around a set of related functions

Low cohesion – designed around a set of unrelated functions