By: F. Buschmann, R. Meunier, H. Rohnert, P. Sommerlad, M. Stal
Published in: Wiley, 1996
Summary: A collection of patterns that spans several levels of abstraction but concentrates on software architecture.
Structure an application to be decomposed into groups of subtasks where each group is at a given level of abstraction.
Category: Architectural, Networks
For systems that process a stream of data. Each processing step is encapsulated in a filter component. Data passes through pipes that connect filters. Combining filters produces families of related systems.
For problems with no deterministic solutions, use several specialized subsystems to assemble knowledge to build a partial solution.
Produce distributed software systems with decoupled components that interact by remote service invocations. The broker coordinates communication, e.g., forwards requests, transmits results and exceptions.
Category: Architectural, Distributed Systems
Divide an interactive application into three components. The model contains the core functionality and data. Views display information to the user. Controllers handle user input. Views and controllers together comprise the user interface. A change-propagation mechanism ensures consistency between the user interface and the model.
Define a hierarchy of cooperating agents to structure interactive software systems. Each agent is responsible for an aspect of the application's functionality and consists of three components: presentation, abstraction, and control. These components separate human-computer aspects of the agent from its functional core and its communication with other agents.
For software systems that must adapt to changing system requirements, separate a minimal functional core from extended functionality and customer-specific parts. The microkernel is a socket for plugging in these extensions and coordinating their collaboration.
Split the application into two parts: (1) a meta level provides information about selected system properties and makes the software self-aware; (2) a base level builds on the meta level and includes the application logic. Changes to the meta level affect base level behavior. This allows the system to dynamically change structure and behavior.
An aggregate component (the whole) encapsulates constituent components (the parts), organizes their collaboration, and provides a common interface to the functionality. Direct access to the parts is not allowed.
Handle computation of replicated services in a system to achieve fault tolerance and robustness. Separate independent slave components that together provide the same service to a master component, which is responsible for invoking them and for selecting a result. Clients communicate only with the master.
Contains: Proxy [Gamma+95],
Separates the request for a service from its execution, manages requests as separate objects, schedules their execution, and provides additional services, e.g., storing request objects for a later undo.
Manage all views of a software system and allow clients to open, manipulate, and dispose of views. Coordinate dependencies between views and organize updates.
Category: GUI Development
Provide transparent interprocess communication for software systems with a peer-to-peer interaction model. Forwarders and receivers decouple peers from the underlying communication mechanisms.
Category: Communications, Distributed Systems
A dispatcher component is an intermediary between clients and servers. The dispatcher provides location transparency with a name service and hides details of the communication connection.
Category: Client-Server, Communications, Distributed Systems
Keep the state of cooperating components synchronized by enabling one-way propagation of changes. One publisher notifies any number of subscribers about changes to its state.
Improves memory management of dynamically allocated, shared objects in C++ by introducing a reference counter to a body class updated by handle objects. Clients access body class objects only through handles. This pattern was first described in [Coplien92] and later expanded in [Coplien99c]
Category: C++ Idioms