1. Basic introduction

The rule is to use composition/aggregation rather than inheritance whenever possible

2. Core ideas of design principles

  1. Identify changes that may need to be made in your application and isolate them from code that doesn’t need to be changed.

  2. Program for interfaces, not implementations.

  3. Strive for loose coupling design between interacting objects