1. Take what varies and encapsulate it. And it will not affect rest of our code.
  2. Program to an interface/supertype and not to an implementation.
  3. Favor composition over inheritance.