blob: 431177d3ef73e6e402ec5b84a6baa2a94bcb1e00 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<org.eclipse.epf.uma:ContentDescription xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI" xmlns:org.eclipse.epf.uma="http://www.eclipse.org/epf/uma/1.0.5/uma.ecore"
xmlns:epf="http://www.eclipse.org/epf" epf:version="1.5.0" xmi:id="_QvmkAMM1EdmSIPI87WLu3g"
name="patterns,_0YJvUMlgEdmt3adZL5Dmdw" guid="_QvmkAMM1EdmSIPI87WLu3g" changeDate="2007-02-26T01:45:45.531-0800"
version="1.0.0">
<mainDescription>&lt;h4>&#xD;
Origins&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
The idea of patterns as it is now applied to software design comes from the work of Christopher Alexander. He has&#xD;
written widely on the subject of applying patterns to the design and construction of towns and buildings. Two of his&#xD;
books, &lt;em>A Pattern Language&lt;/em> [&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#ALE77&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>ALE77&lt;/a>] and &lt;em>The Timeless Way of Building&lt;/em> [&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#ALE79&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>ALE79&lt;/a>] have had the greatest impact on the software community and the adoption of&#xD;
software patterns for the design of software. His concepts of patterns and pattern language provide a model for the&#xD;
capture of software design expertise in a form that can then be reapplied in recurring situations.&#xD;
&lt;/p>&#xD;
&lt;h4>&#xD;
A definition of patterns&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
Today, the most commonly used definition of software patterns is from [&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#GAM95&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>GAM95&lt;/a>]:&#xD;
&lt;/p>&#xD;
&lt;blockquote>&#xD;
&lt;p>&#xD;
&quot;A design pattern describes the problem, a solution to the problem consisting of a general arrangement of objects&#xD;
and classes, when to apply the solution, and the consequences of applying the solution.&quot;&#xD;
&lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;p>&#xD;
This definition often serves only as a starting point, however. A richer definition, based on Alexander’s work, is&#xD;
offered by Gabriel in his book, &lt;em>A Timeless Way of Hacking&lt;/em> [&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#ALU03&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>ALU03&lt;/a>], in which each pattern is a three-part rule that expresses relationships&#xD;
among a certain context, a certain system of forces that occur repeatedly in that context, and a certain software&#xD;
configuration that allows these forces to resolve themselves.&#xD;
&lt;/p>&#xD;
&lt;h4>&#xD;
Describing patterns&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
It is commonplace to describe patterns&amp;nbsp;using the&amp;nbsp;format made popular by Erich Gamma and his three colleagues&#xD;
[&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#GAM95&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>GAM95&lt;/a>]. They have come to be known as the Gang of Four (GoF); therefore, their&#xD;
description is known as the &lt;strong>GoF format&lt;/strong>. The GoF format uses the following keywords to describe&#xD;
object-oriented design patterns:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Pattern name and classification:&lt;/strong> Naming the pattern allows design to work at a higher level of&#xD;
abstraction, using a vocabulary of patterns. Gamma says that finding a good name is one of the hardest problems&#xD;
of developing a catalogue of patterns (see &lt;strong>Pattern catalogues&lt;/strong> later in this section).&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Intent:&lt;/strong> An answer to questions such as: What does the pattern do? What problem does it&#xD;
address?&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Also known as:&lt;/strong> Other names for the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Motivation:&lt;/strong> A concrete scenario that illustrates a design problem and how the pattern solves&#xD;
the problem.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Applicability:&lt;/strong> Instructions for how you can recognize situations in which patterns are&#xD;
applicable.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Structure:&lt;/strong> A graphical representation of the classes in the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Participants:&lt;/strong> The responsibilities of the classes and objects that participate in the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Collaborations:&lt;/strong> How participants collaborate to fulfil their responsibilities.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Consequences:&lt;/strong> The results, side effects and trade offs caused by using the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Implementation:&lt;/strong> Guidance on the implementation of the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Sample code:&lt;/strong> Code fragments that illustrate the pattern’s implementation.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Known uses:&lt;/strong> Where to find real-world examples of the pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Related patterns:&lt;/strong> Synergies, differences, and other pattern relationships.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
Although the GoF format is specifically intended for object-oriented development, you can use it, with slight&#xD;
modification, to address other software patterns. A more general keyword format for software patterns based on&#xD;
Alexander’s principles uses keywords such as &lt;em>problem&lt;/em>, &lt;em>context&lt;/em>, &lt;em>forces&lt;/em> and &lt;em>solution&lt;/em>.&#xD;
&lt;/p>&#xD;
&lt;h4>&#xD;
Pattern catalogs&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
To assist with the identification and selection of patterns, various classification schemes have been proposed. One of&#xD;
the early schemes, proposed by Buschmann and his associates, [&lt;a class=&quot;elementLinkWithUserText&quot; href=&quot;./../../../openup/guidances/supportingmaterials/references_6CCF393.html#BUS96&quot; guid=&quot;_9ToeIB83Edqsvps02rpOOg&quot;>BUS96&lt;/a>] uses three classifiers: granularity, functionality, and structured&#xD;
principles. Of those three classifiers, it is their granularity classifier that has remained popular. Granularity&#xD;
classifies patterns into three levels of abstraction:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Architectural patterns:&lt;/strong> Architectural patterns express the fundamental structure of a software&#xD;
scheme. Examples of architectural pattern include: layers, pipes and filters, and the model view controller&#xD;
pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Design patterns:&lt;/strong> Software architecture usually consists of smaller architectural units that&#xD;
are described by design patterns. The GoF pattern is an example of a design pattern.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
&lt;p>&#xD;
&lt;strong>Idioms.&lt;/strong> An idiom is the lowest-level pattern, and it is specific to a programming language.&#xD;
&lt;/p>&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
Buschmann and his colleagues introduced four groups for categorizing architectural patterns:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
Structure&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Distributed systems&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Interactive systems&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Adaptable systems&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;p>&#xD;
The following table shows the categorization of their architectural patterns.&#xD;
&lt;/p>&#xD;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;85%&quot; summary=&quot;Categories for Architectural Patterns [BUS96]&quot; border=&quot;1&quot; valign=&quot;top&quot;>&#xD;
&lt;caption>&#xD;
&lt;strong>Categories for Architectural Patterns&lt;br />&#xD;
&lt;/strong>&#xD;
&lt;/caption>&#xD;
&lt;tbody>&#xD;
&lt;tr>&#xD;
&lt;th scope=&quot;col&quot;>&#xD;
&lt;div align=&quot;center&quot;>&#xD;
&lt;strong>Category&lt;/strong>&#xD;
&lt;/div>&#xD;
&lt;/th>&#xD;
&lt;th scope=&quot;col&quot;>&#xD;
&lt;div align=&quot;center&quot;>&#xD;
&lt;strong>Pattern&lt;/strong>&#xD;
&lt;/div>&#xD;
&lt;/th>&#xD;
&lt;/tr>&#xD;
&lt;tr>&#xD;
&lt;td>&#xD;
Structure&#xD;
&lt;/td>&#xD;
&lt;td>&#xD;
&lt;p>&#xD;
Layers&lt;br />&#xD;
Pipes and filters&lt;br />&#xD;
Blackboard&#xD;
&lt;/p>&#xD;
&lt;/td>&#xD;
&lt;/tr>&#xD;
&lt;tr>&#xD;
&lt;td>&#xD;
Distributed systems&#xD;
&lt;/td>&#xD;
&lt;td>&#xD;
Broker&#xD;
&lt;/td>&#xD;
&lt;/tr>&#xD;
&lt;tr>&#xD;
&lt;td>&#xD;
Interactive systems&#xD;
&lt;/td>&#xD;
&lt;td>&#xD;
Model view controller&lt;br />&#xD;
Presentation abstraction control&#xD;
&lt;/td>&#xD;
&lt;/tr>&#xD;
&lt;tr>&#xD;
&lt;td>&#xD;
&lt;p>&#xD;
Adaptable systems&#xD;
&lt;/p>&#xD;
&lt;/td>&#xD;
&lt;td>&#xD;
&lt;p>&#xD;
Reflection&lt;br />&#xD;
Micro kernel&#xD;
&lt;/p>&#xD;
&lt;/td>&#xD;
&lt;/tr>&#xD;
&lt;/tbody>&#xD;
&lt;/table>&#xD;
&lt;p>&#xD;
For design patterns, Gamma's group categorized their design patterns by purpose, using three categories:&#xD;
&lt;/p>&#xD;
&lt;ul>&#xD;
&lt;li>&#xD;
Creational&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Structural&#xD;
&lt;/li>&#xD;
&lt;li>&#xD;
Behavioral&#xD;
&lt;/li>&#xD;
&lt;/ul>&#xD;
&lt;h4>&#xD;
Pattern languages&#xD;
&lt;/h4>&#xD;
&lt;p>&#xD;
In addition to the concept of patterns, Alexander also gave the software community the concept of a pattern language.&#xD;
The purpose of developing a pattern language was to provide a vocabulary of design principles (patterns) that would&#xD;
allow those who work, study, or live in buildings to communicate effectively with the planners and designers of those&#xD;
buildings. Alexander explains that when using a pattern language:&#xD;
&lt;/p>&#xD;
&lt;blockquote>&#xD;
&lt;p>&#xD;
We always use it as a sequence, going through the patterns, moving always from the larger patterns to the smaller,&#xD;
always from the ones that create structure to the ones which then embellish those structures, and then to those&#xD;
that embellish the embellishments.&#xD;
&lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;p>&#xD;
In applying patterns in this way, Alexander advocated the use of generative pattern languages, ones that, given an&#xD;
initial context, would always lead to good design.&amp;nbsp; Alexander&amp;nbsp;states:&#xD;
&lt;/p>&#xD;
&lt;blockquote>&#xD;
&lt;p>&#xD;
Thus, as in the case of natural languages, the pattern language is generative. It not only tells us the rules of&#xD;
arrangement, but shows us how to construct arrangements — as many as we want — which satisfies the rules.&#xD;
&lt;/p>&#xD;
&lt;/blockquote>&#xD;
&lt;p>&#xD;
In the application of software patterns, pattern names provide a vocabulary for the communication of software ideas.&#xD;
The sequential application of patterns finds application in software design processes, both waterfall and iterative,&#xD;
that successively apply architectural patterns, and then design patterns, and, finally, idioms to design and implement&#xD;
a software system. Software processes, however, rely on the skills of the Architect and Developer roles to guide the&#xD;
application of patterns, rather than a generative pattern language.&#xD;
&lt;/p></mainDescription>
</org.eclipse.epf.uma:ContentDescription>