Bridge Pattern
TL;DR
TL;DR
Assign object creation responsibility to the class best suited to create instances
High-level modules should not depend on low-level modules; both should depend on abstractions. Invert the dependency flow.
Master DRY principle: eliminate knowledge duplication for maintainable code, improved consistency, and reduced bugs.
Identify volatile aspects of your system and hide them behind stable interfaces to reduce coupling and change impact.
TL;DR
Clients should not depend on interfaces they don't use. Break large interfaces into smaller, focused ones.
Access elements of a collection sequentially without exposing its underlying representation
Minimize dependencies between classes to improve flexibility, testability, and maintainability
Software entities should be open for extension, closed for modification. Design for change without breaking existing code.
Abstraction patterns for database persistence with trade-offs in coupling and control
Protect classes from variations in other classes using abstraction and stable interfaces
Create artificial classes to represent operations when assigning to domain objects would violate other principles