Design Patterns
Introduction
“Patterns are discovered, not invented”
Richard Helm
What’s a pattern?
A pattern is a named abstraction
from a concrete form that
represents a recurring solution to a
particular problem.
Categories of Patterns
Design patterns vary in granularity and
level of abstraction.
By categorizing patterns, it becomes
easier to recognize and learn them
patterns can be categorized by purpose
or scope
purpose reflects what the pattern does
scope specifies if the pattern applies to
classes or objects
purpose
reflects what the pattern does
Creational -- facilitate object creation
Structural -- deal with the
composition of classes or objects
Behavioral -- deal with the way
objects interact and distribute
responsibility
scope
whether the pattern applies to classes
or objects
class patterns:
deal with relationships between classes or
subclasses established through inheritance
these relationships are fixed at compile time
objects patterns: deal with object
relationships that can be changed at
runtime
other ways to organize patterns
some patterns are frequently used with
other patterns, for example composite is
often used with visitor and/or iterator
some patterns are alternatives:
Prototype is usually an alternative for
Abstract Factory
Some patterns are very similar in
structure, such as Composite and
Decorator
How do Design Patterns Solve
Design Problems?
The meaning of OO is well-known
The hard part is decomposing the
system into objects to exploit:
encapsulation
flexibility, extensibility
ease of modification
performance
evolution
reusability
Finding objects
Many objects in the design come
from the analysis model
But OO designs often end up with
classes that have no counterpart in
the real world
Design Patterns help the modeler to
identify less obvious abstractions
and the objects that can capture
them.
Inheritance
Inheritance is a mechanism for reuse
you can define a new kind of object in
terms of the old one
you get new implementations almost
for free, inheriting most of what you
need from an existing class
This is only half the story!
Program to an interface,
not an implementation
Inheritance permits defining a family of
objects with identical interfaces
polymorphism depends on this!
all derived classes share the base class
interface
Subclasses add or override 0perations, rather
than hiding operations
All subclasses then respond to requests in the
interface of the abstract class
Inheritance properly used
clients are unaware of types of objects:
heuristic 5.12 - “explicit case analysis on the
type of an object is usually an error. The
designer should use polymorphism”. Riel
clients only know about the abstract classes
defining the interface. heuristic 5.7: “All base
classes should be abstract”. Riel
This reduces implementation dependencies
program to an interface, not an implementation
creational patterns help ensure this rule!
Two techniques for reuse
inheritance: white box
object composition: black box
advantage of inheritance for
reuse
defined statically
supported directly by the language:
straightforward to use
easier to modify implementation
being reused
disadvantage of inheritance
can’t change inherited implementation at runtime
parent classes often define part of their
subclass’s physical representation
because inheritance exposes the parent
implementation it’s said to “break
encapsulation” (GOF p.19, Sny86)
change in parent => change in subclass
What if inherited attribute is inappropriate?
object composition:
black box reuse
objects are accessed solely through their
interfaces: no break of encapsulation
any object can be replaced by another
at runtime: as long as they are the
same type
favor object composition over class
inheritance. GOF p. 20
but inheritance & composition work
together!
Delegation
“a way of making composition as
powerful for reuse as inheritance”:
GOF, p. 20
[JZ91] Ralph Johnson and Jonathan Zweig,
Delegation in C++, JOOP, f(11):22-35,
Nov. 91
[Lie86] Henry Lieberman. Using
prototypical objects to implement shared
behavior in OO systems. OOPSLA, pp 214223, Nov. ‘86
delegation: reuse
In delegation, 2 objects handle a
request
analogous to subclass deferring
request to parent
in delegation, the receiver passes
itself to the delegate to let the
delegated operation refer to the
receiver!
delegating area() to rectangle
Rectangle
Window
area()
return rectangle->area()
Has-a
area()
width
height
return width*height
advantages of delegation
can change behaviors at run-time
window can become square at runtime by replacing Rectangle with
Square, (assuming Rectangle & Square
are same type!)
There are run-time costs.
delegation in patterns: State,
Strategy, Visitor, Mediator, Bridge
delegating area() to square
Square
Window
area()
return square->area()
Has-a
area()
side
return side*side
Patterns make design resistant to re-design
Robustness to Change
Algorithmic dependencies: Template Method,
Visitor, Iterator, Builder, Strategy.
Creating an object by specifying a class
explicitly: Abstract Factory, Factory Method,
Prototype
Dependence on specific operations: Command,
Chain of Responsibility
Dependence on object representation or
implementation: Abstract Factory, Bridge, Proxy
Tight coupling: Abstract Factory, Command,
Facade, Mediator, Observer, Bridge
Patterns make design resistant to redesign
Extending functionality by subclassing:
Command, Bridge, Composite, Decorator,
Observer, Strategy
Inability to alter classes conveniently:
Visitor, Adapter, Decorator
Design Confidence
Design Inexperience: “Is my design
ok?”
Patterns engender confidence
used twice & blame the GOF
still room for creativity
Design Coverage
Large portion of design can be
covered by patterns
Seductively simple to implement
most explained in a few pages
add no “extra-value” to end-user
You still have to write functionality:
patterns don’t solve the problem
Design Understanding
Most people know the patterns
If you’re looking at someone’s design & you
identify a pattern, you immediately
understand much of the design
Common design vocabulary
“Let’s use a Builder here”
Design language beyond language
syntax
Problem-oriented language
program in rather than into the language
Common Problems
Getting the “right” pattern
Taming over-enthusiasm
you “win” if you use the most patterns
everything solved by the last pattern you
learned
How to select a pattern
know a basic catalog
scan intent section
study patterns of like purpose
consider a cause of redesign