Depend on abstractions rather than concrete classes. Design collaborations between objects around shared interfaces or abstract types so that you can swap implementations freely without changing the code that uses them.
Examples:
- A
Companyclass that directly instantiatesDesignerandDeveloperobjects is tightly coupled. Extract anEmployeeinterface with adoWork()method, make each employee type implement it, and haveCompanydepend only onEmployee. Adding a new employee type then requires no changes toCompany.