Structural Patterns
Rules of thumb
-
Adapter makes things work after they're designed; Bridge
makes them work before they are. [GOF, p219]
-
Bridge is designed up-front to let the abstraction and the
implementation vary independently. Adapter is retrofitted to
make unrelated classes work together. [GOF, p161]
-
Adapter provides a different interface to its subject.
Proxy provides the same interface. Decorator provides an
enhanced interface. [GOF, p216]
-
Adapter changes an object's interface, Decorator enhances
an object's responsibilities. Decorator is thus more
transparent to the client. As a consequence, Decorator supports
recursive composition, which isn't possible with pure Adapters.
[GOF, p149]
-
Composite and Decorator have similar structure diagrams,
reflecting the fact that both rely on recursive composition to organize
an open-ended number of objects. [GOF, p219]
-
Composite can be traversed with Iterator. Visitor
can apply an operation over a Composite. Composite could
use Chain of Responsibility to let components access global
properties through their parent. It could also use Decorator to
override these properties on parts of the composition. It could use
Observer to tie one object structure to another and State
to let a component change its behavior as its state changes. [GOF,
pp173,349]
-
Composite can let you compose a Mediator out of smaller
pieces through recursive composition. [Vlissides, Apr96, p18]
-
Decorator lets you change the skin of an object.
Strategy lets you change the guts. [GOF, p184]
-
Decorator is designed to let you add responsibilities to objects
without subclassing. Composite's focus is not on embellishment
but on representation. These intents are distinct but complementary.
Consequently, Composite and Decorator are often used in
concert. [GOF, p220]
-
Decorator and Proxy have different purposes but similar
structures. Both describe how to provide a level of indirection to
another object, and the implementations keep a reference to the object
to which they forward requests. [GOF, p220]
-
Facade defines a new interface, whereas Adapter reuses an
old interface. Remember that Adapter makes two existing
interfaces work together as opposed to defining an entirely new one.
[GOF, p219]
-
Facade objects are often Singletons because only one
Facade object is required. [GOF, p193]
-
Mediator is similar to Facade in that it abstracts
functionality of existing classes. Mediator
abstracts/centralizes arbitrary communication between colleague
objects, it routinely "adds value", and it is known/referenced by the
colleague objects. In contrast, Facade defines a simpler
interface to a subsystem, it doesn't add new functionality, and it is
not known by the subsystem classes. [GOF, p193]
-
Abstract Factory can be used as an alternative to Facade
to hide platform-specific classes. [GOF, p193]
-
Whereas Flyweight shows how to make lots of little objects,
Facade shows how to make a single object represent an entire
subsystem. [GOF, p138]
-
Flyweight is often combined with Composite to implement
shared leaf nodes. [GOF, p206]
-
Flyweight explains when and how State objects can
be shared. [GOF, p313]