Allows for one or more operation to be applied to a set of objects at runtime, decoupling the operations from the object structure.
Define the basic steps of an algorithm and allow the implementation of the individual steps to be changed.
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
A cleaner way for an object to change its behavior at runtime without resorting to large monolithic conditional statements.
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
Capture an object’s internal state and externalize it so that it can be restored to that state later.
Promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.