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.
Observer Pattern - defines a one-to-many dependency between objects so that when one object changes state, all of its dependents are notified and updated automatically.
Decorator Pattern - attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.