- The system shall be "platform-independent"
- The system shall be independent of how its constituent pieces are
created, composed, and represented.
- The system shall be configured with one of multiple families of products.
- A family of products designed to be used together shall have their
relationship constraints enforced.
- "case" statements are a maintenance nightmare - they shall be avoided.
| |
Abstract Factory
|
- The algorithm for creating a complex subsystem shall be independent
of the parts that make up the subsystem and how the parts are assembled.
- The creation process for a complex subsystem shall support multiple
representations of that subsystem.
| |
Builder
|
- A subsystem shall not have the "type" of component it is responsible
for creating hard-wired.
- The system shall be "open for extension, but closed for modification".
| |
Factory Method
|
- The overhead of component creation shall be localized and minimized.
Instead of creating entirely new instances of a component type, a
"prototypical" instance of each type shall be designed to "clone" itself.
- Decisions about the type of component to create shall be deferred until
application run-time.
| |
Prototype
|
- A single instance of a subsystem shall be enforced, and the subsystem
itself shall be responsible for that enforcement.
- The single instance shall be globally accessible.
- The single instance shall be initialized only if, and when, it is accessed.
| |
Singleton
|
- A legacy component shall be reused in a new design, and the interface
"impedance mismatch" shall be reconciled.
- A reusable component shall cooperate with unrelated (or unforeseen)
application components.
| |
Adapter
|
- Component interfaces shall be decoupled from their implementation(s).
- The client shall be "insulated" from implementation changes. [Changes
to implementation details should only require a re-link, not a re-compile.]
- The choice of implementation shall be configurable at run-time.
- Both the "interface" and the "implementation" shall be separately "open
for extension, but closed for modification".
- "Interface" components that represent "implementation" components that
are "expensive" and "equal" shall share these implementations, instead of
duplicating them.
| |
Bridge
|
- The system shall support recursive composition.
- The system shall support "whole-part" hierarchical assemblies of
components.
- Clients shall be able to transparently interact with compositions of
components (e.g. a sub-tree) and individual components (e.g. a node).
| |
Composite
|
- Components shall be extensible at run-time.
- Functionality shall be "layer-able". The client shall be capable of
configuring any combination of capabilities by simply specifying the layers
(or wrappers, or onion skins) to be applied.
| |
Decorator
|
- The system shall provide a simple interface to a complex subsystem.
- The system shall provide alternative novice, intermediate, and
"power-user" interfaces.
- The system shall decouple subsystems from each other.
- The system shall support "layering" of subsystems.
| |
Facade
|
- The system shall employ hundreds of components at very fine levels
of granularity without prohibitive cost.
- The system shall support pooling and reuse of a finite supply of "x"
across an inexhaustible demand.
| |
Flyweight
|
- The system shall support "distributed processing" by providing a local
representative for a component in a different address space.
- The system shall support "lazy creation" - a component is created
only if, and when, the client demonstrates an interest in it.
- The system shall control access to components by interposing an
intermediary that evaluates the identity and access priviledges of the
requestor.
- The system architecture shall be characterized by multiple dimensions
of indirection that offer a locus for intelligence that would unduly
complicate other components if they were obliged to support the additional
responsibility.
| |
Proxy
|
- The system shall allow the client to issue a request to one of several
"handlers" without knowing or specifying the receiver explicitly.
- The system shall allow a suite of "handlers" to be configured at
run-time.
- The system shall allow the client to "launch and leave" a request
with a "virtual pipeline of handlers".
- "Senders" and "receivers" shall be decoupled from one another.
| |
Chain of Responsibility
|
- The system architecture shall provide a "callback" framework.
- The system shall encapsulate "execute" requests so that they may be
created, queued, and subsequently serviced. They may also be logged,
archived, loaded, and re-applied.
- The system shall support hierarchical compositions of primitive
"command" abstractions.
- The system shall support reuse of "command" abstractions. [Define a
"command", and simultaneously attach the encapsulation to a push
button, a toolbar icon, a menu item, and a keyboard accelerator - so that
all users of the GUI can enjoy their preferred method of interaction.]
- The system shall support "redo"
- The system shall support transactions
- "Senders" and "receivers" shall be decoupled from one another.
| |
Command
|
- The system shall characterize the domain as a set of rules, then
define a language capable of specifying the rules, and a grammar for defining
the language, and an "engine" for interpreting the grammar.
| |
Interpreter
|
- The system shall support accessing an aggregate component's contents
without exposing its internal representation.
- The system shall support multiple simultaneous traversals of aggregate
components without complicating the implementation of the aggregate itself.
- The system shall define a uniform interface for traversing dissimilar
aggregate components.
- The system shall decouple "data structures" from "algorithms" so that
each can be developed, maintained, and used independent of the other.
| |
Iterator
|
- The system shall encapsulate complex, many-to-many coupling between
"peer" components in a separate component capable of allowing the "peers"
to be: disengaged, replaced, and reused.
- The system shall support numerous many-to-many "mappings" to be defined,
installed, and exchanged by the client.
- The system shall balance the distribution of intelligence emphasized by
"logical" OO design with the centralization of intelligence often required by
"physical" large scale design.
- "Senders" and "receivers" shall be decoupled from one another.
| |
Mediator
|
- The system shall support "undo" or "rollback"
- The system shall support transactions
- The system shall support saving, or "flattening", or "streaming"
components without compromising their encapsulation.
| |
Memento
|
- The system shall support multiple "views" of the same "model" (or
"subscribers" to the same "publisher", or "consumers" to the same
"producer").
- Each "model" component shall be decoupled from the number and type of its
"view" components.
- Each "view" component shall be capable of driving the flow of information
from the "model" to itself.
- "Independent" components shall be decoupled from "dependent" components.
- "Senders" and "receivers" shall be decoupled from one another.
| |
Observer
|
- Components shall be capable of "morphing" their behavior at run-time.
- The system architecture shall be characterized by a "finite state machine".
The state machine will need to support application logic at each state
transition, not simply the transition itself. [A "table-driven" approach
routinely supports only the latter.]
- "case" statements are a maintenance nightmare - they shall be avoided.
| |
State
|
- Clients shall be decoupled from "choice of algorithm".
- Clients shall be decoupled from complex, algorithm-specific data
structures.
- The choice, or implementation, of algorithm shall be configurable at
run-time.
- "case" statements are a maintenance nightmare - they shall be avoided.
| |
Strategy
|
- Individual steps of an algorithm shall be defineable or replaceable.
- The system shall provide "hooks" wherever future functionality or
extensibility may be required.
- The "invariant" parts of an algorithm shall be implemented in one place,
and reused all other places.
- The "standard" parts of an algorithm shall be implemented and enforced
in one place.
- Reuse shall be emphasized by architecting a "don't call us, we'll call you"
framework.
- The system shall be "open for extension, but closed for modification".
| |
Template Method
|
- The system shall allow the operations that can be performed on
"whole-part" hierarchical assemblies of components to be defined and added
without having to change (and potentially break) any existing code.
- The system shall decouple "data structures" from "algorithms" so that
each can be developed, maintained, and used independent of the other.
- The design shall support the recovery of "lost type information" without
resorting to the overhead associated with RTTI.
- "case" statements are a maintenance nightmare - they shall be avoided.
- The system shall be "open for extension, but closed for modification".
| |
Visitor
|