The Strategy Pattern defines a family of algorithms, encapsulates each one, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
1 - Identify the aspects of your application that vary and separate them from what stays the same.
2 - Program to an interface, not an implementation
3 - Favor composition over inheritance
The Decorator Pattern attaches additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
5 - Classes should be open for extension but closed for modification