Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and update automatically.
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from the clients that use it.
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
Attach individual responsibilites to an object dynamically. Decorators provide a flexible alternative to sublassing for extending functionaliaty.