SE05 Design Patterns
SE05 Design Patterns
Design Patterns
http://softeng.polito.it/courses/09CBI
Version 3.8.0
© Marco Torchiano, 2020
Licensing Note
Under the following conditions:
§ Attribution. You must attribute the work in the manner specified by
the author or licensor.
§ Non-commercial. You may not use this work for commercial purposes.
§ No Derivative Works. You may not alter, transform, or build upon this
work.
§ For any reuse or distribution, you must make clear to others the
license terms of this work.
§ Any of these conditions can be waived if you get permission from the
copyright holder.
Your fair use and other rights are in no way affected by the above.
2
1
6/11/21
Pattern
A reusable solution
to a known problem
in a well defined context
Pattern
§ Context
w A (design) situation giving rise to a (design)
problem
§ Problem
w Set of forces repeatedly arising in the context
– Force: any relevant aspect of the problem (Eg.
requirements, constraints, desirable properties)
§ Solution
w A proven resolution of the problem
w Configuration to balance forces
– Structure with components and relationships
– Run-time behaviour
2
6/11/21
Example
§ Context:
w At the supermarket several customers crowd the
gastronomy desk to get their fresh cut of ham
§ Problem:
w Customers quarrel to have their turn first
w Order of arrival should be obeyed
w It is hard to spot who arrived earlier or later
§ Solution:
w Provide numbered tickets the customer take as
soon as they arrive and which they are called by
History
§ Initially proposed by Chrisopher
Alexander
§ He described patterns for architecture
(of buildings)
w The pattern is, in short, at the same time
a thing, which happens in the world, and
the rule which tells us how to create that
thing and when we create it. It is both a
process and a thing …
3
6/11/21
Types of Pattern
§ Architectural Patterns
w Address system wide structures
§ Design Patterns
w Leverage higher level mechanisms
§ Idioms
w Leverage language specific features
Architectural pattern
§ Expresses a fundamental structural
organization schema for software
systems
§ Provides a set of predefined
components with their responsibilities
§ Defines the rules and guidelines for
organizing the relationships between
the components
4
6/11/21
Example
§ Context:
w several programs that are used in sequence read
from input and write sequentially to output
§ Problem:
w there are a lot of intermediate files used for
communication between programs
§ Solution:
w adopt a pipe & filter architecture feeding a
program with the result of the previous one
Design pattern
§ Provides a scheme for refining
components of a software system or
their relationships
§ Describes a commonly recurring
structure of communicating
components
10
10
5
6/11/21
Example
§ Context:
w A class library providing few functionalities
contains a lot of classes
§ Problem:
w The user is exposed to the internal complexity of
the library
§ Solution:
w Create a new façade class that interacts with the
user and hide all the details
11
11
Idiom
§ Is a low-level pattern specific to a
programming language
§ Describes how to implement particular
aspects of components or the
relationships between them
§ Leverages the features of a
programming language
12
12
6
6/11/21
Example
§ Context:
w An attribute is constant and should be
globally available to many classes
§ Problem:
w Opening access would allow unauthorized
modifications
w The attribute is repeated in every object
§ Solution:
w Make it public static final
13
13
Pattern Description
§ Name
§ Problem § Name
§ Context § Intent
§ Motivation
§ Forces
§ Applicability
§ Solution
§ Structure
§ Force Resolution § Participants
§ Design Rationale § Collaborations
§ Consequences
§ Implementation
§ Related Patterns
14
14
7
6/11/21
Pattern language
§ Pattern do not exist in isolation
w Two or more patterns are applied
together
w A pattern is used to implement part of
another pattern
w A pattern can introduce a problem solved
by another
§ We have Pattern Languages
w Or pattern systems
15
15
Pattern Language
§ Collection of patterns together with
guidelines for
w Implementation
w Combination
w Practical use
§ Should
w Count enough patterns
w Describe patterns uniformly
w Present relationships
16
16
8
6/11/21
Example
§ MVC is implemented using
w Observer
w Iterator
17
17
18
18
9
6/11/21
19
19
Design patterns
§ Description of communicating objects
and classes that are customized to
solve a general design problem in a
particular context
§ A design pattern names, abstracts,
and identifies the key aspects of a
common design structure that make it
useful for creating a reusable object-
oriented design
20
20
10
6/11/21
Description
§ Name and classification
§ Intent
w Also known as
§ Motivation
§ Applicability
§ Structure
§ Participants
§ Collaborations
§ Consequences
§ Implementation
§ Sample code
§ Known uses
§ Related patterns
21
21
Pattern classification
§ Purpose
w Creational
w Structural
w Behavioral
§ Scope
w Class
w Object
22
22
11
6/11/21
Pattern classification
Purpose
Creational Structural Behavioral
Class 1 1 2
Scope
Object 4 6 10
23
23
Pattern selection
§ Consider how patterns solve problems
§ Scan intent sections
§ Study how pattern interrelate
§ Study patterns of like purpose
§ Examine a cause of redesign
§ Consider what should be variable in
your design
24
24
12
6/11/21
Using a pattern
§ Read through the pattern
§ Go back and study
w Structure
w Participants
w Collaborations
§ Look at the sample code
25
25
Using a pattern
§ Choose names for participants
w Meaningful in the application context
§ Define the classes
§ Choose operation names
w Application specific
§ Implement operations
26
26
13
6/11/21
Creational patterns
§ Factory Method
§ Abstract Factory
§ Builder
§ Prototype
§ Singleton
27
27
Abstract Factory
§ Context
w A family of related classes can have
different implementation details
§ Problem
w The client should not know anything
about which variant they are using /
creating
28
28
14
6/11/21
Client
WidgetFactory
#Operation(i: int): int
/+createWindow()
/+createButton() AbstractWindow
...
WindowVista WindowOSX
ConcreeFactoryVista ConcreeFactoryOSX
#Operation(i: int): int #Operation(i: int): int
/+createWindow() /+createWindow() creates
/+createButton() /+createButton()
... ...
creates
29
29
Abstract Factory
Client
AbstractFactory
#Operation(i: int): int
/+createProductA()
/+createProductB() AbstractProductA
...
ConcreteProductAX ConcreteProductAY
ConcreeFactoryX ConcreeFactoryY
#Operation(i: int): int #Operation(i: int): int
/+createProductA() /+createProductA() creates
/+createProductB() /+createProductB()
... ...
creates
30
30
15
6/11/21
Singleton
§ Context:
w A class represents a concept that requires
a single instance
§ Problem:
w Clients could use this class in an
inappropriate way
31
31
Singleton Pattern
Singleton
Singleton class
-Singleton()
+getInstance(): Singleton
singletonOperation() Instantiation
static method
private Singleton() { }
private static Singleton instance;
public static Singleton getInstance(){
if(instance==null)
instance = new Singleton();
return instance;
}
32
32
16
6/11/21
Singleton Example
§ java.awt.Toolkit
w Singleton + FactoryMethod
java.awt::Toolkit
-Toolkit()
+getDefaultToolkit(): Toolkit
...
33
33
Builder object
§ Context
w An object of a complex class has to be
created
§ Problem
w The creation entails complex interaction
with the object
w Different variation of the target object
might be created
34
34
17
6/11/21
Builder Pattern
Builder ConcreteBuilder
Director
+ buildPart() : void + buildPart() : void
<<create>>
Product
35
35
Builder example
Abstract Builder Concrete Builder
<<interface>>
StringBuilder
Client Appendable
+ append() : Appendable
+ append() : Appendable
<<create>>
Director
String
Complex object
36
36
18
6/11/21
Builder
Measure
+ is() : Builder
+ by() : Builder
+ build() : Builder
+ squared() : Builder object
0..1 1 + addUnit() : void
+ to() : Builder
+ setPrecision() : void
+ withPrecision() : Builder
+ done() : Measure
37
37
Structural patterns
§ Structural patterns are concerned with
how classes and objects are composed
to form larger structures.
38
38 1/1
19
6/11/21
39
39
Adapter
§ Context:
w A class provides the features required by
another class but its interface is not the
one expected
§ Problem:
w The integration of the provider class
should be possible without modifying it
– Its source code could be not available
– It is already used as it is somewhere else
40
40
20
6/11/21
Adapter
Target
Client
Request()
Adaptee
adaptee SpecificRequest()
Adapter
Request()
41
41
Adapter example
DrawingEditor Shape
BoundingBox()
CreateManipulator()
TextView
GetExtent()
Line TextShape
BoundingBox() BoundingBox()
CreateManipulator() CreateManipulator()
42
42
21
6/11/21
43
43
class MyListener{
public void KeyReleased(..){
// … handle event
}
}
44
44
22
6/11/21
«interface»
KeyListener use
JFrame
KeyPressed()
KeyReleased()
KeyTyped()
Extends
KeyAdapter
Implements KeyPressed()
KeyReleased()
KeyTyped()
MyFrame
Extends
MyListener
KeyReleased()
45
45
46
46
23
6/11/21
Composite
§ Context:
w You need to represent part-whole
hierarchies of objects
§ Problem
w Clients are complex
w Difference between composition objects
and individual objects.
47
47
Composite
Client Component
child
operation()
add(Component ) 0..*
remove(Component )
getChild()
Leaf Composite
operation() operation()
add(Component )
remove(Component )
getChild()
48
48
24
6/11/21
Composite Example
§ Arithmetic expressions representation
w Operators
w Operands
§ Evaluation of expressions
49
49
Composite Example
Calculator Expression
operands
evaluate()
print() 0..*
Value Operation
evaluate() op: String
print() evaluate()
print()
50
50
25
6/11/21
Composite Example
abstract class Expression {
public abstract int evaluate();
public abstract String print();
}
51
51
Composite Example
class Value {
private int value;
public Value(int v){
value = v;
}
public int evaluate(){
return value;
}
public String print(){
return new String(value);
}
}
52
52
26
6/11/21
Composite Example
class Operation {
private char op; // +, -, *, /
private Expression left, right
53
53
Composite Example
class Operation {
…
public evaluate(){
switch(op){
case ‘+’: return
left.evaluate() +
right.evaluate();
break;
…
}
}
…
54
54
27
6/11/21
Composite Example
class Operation {
…
public print(){
return left.print() + op +
right.print();
}
}
55
55
Facade
§ Context
w A functionality is provided by a complex
group of classes (interfaces, associations,
etc.)
§ Problem
w How is it possible to use the classes
without being exposed to the details
56
56
28
6/11/21
Facade
Client
Facade
57
57
Behavioral patterns
§ Behavioral patterns are concerned with
algorithms and the assignment of
responsibilities between objects.
§ Not just patterns of objects or classes
but also the patterns of communication.
w Complex control flow that's difficult to follow
at run-time.
w Shift focus away from flow of control to let
concentrate just on the way objects are
interconnected.
58
58
29
6/11/21
59
59
Mechanisms
§ Encapsulating variation
§ Objects as arguments
§ Information circulation policies
§ Sender and Receiver decoupling
60
60
30
6/11/21
Encapsulating Variation
§ A varying aspect of a program
§ Captured by an object
w Other delegate operations to the “variant”
object
61
61
Argument Objects
§ Often an object is passed as argument
w Hides complexity from clients
w Concentrate the “active” code in one class
62
62
31
6/11/21
Information circulation
§ Responsibility of how to circulate
information may be:
w Distributed among different parties.
w Encapsulated in a single object.
63
63
Communication decoupling
§ Decoupling senders and receivers is a
key to:
w Reduce coupling
w Improve reusability
w Enforce layering and structure
64
64
32
6/11/21
Observer
§ Context:
w The change in one object may influence
one or more other objects
§ Problem
w High coupling
w Number and type of objects to be notified
may not be known in advance
65
65
Observer
Subject
attach(Observer) Observer
observers
detach(Observer) update()
0..*
notify()
ConcreteSubject
- state ConcreteObserver
getState() update()
setState()
66
66
33
6/11/21
Observer - Consequences
+ Abstract coupling between Subject
and Observer
+ Support for broadcast communication
- Unanticipated updates
67
67
Observer-Observable
§ Allow a standardized interaction
between an objects that needs to
notify one or more other objects
§ Defined in package java.util
§ Class Observable
§ Interface Observer
68
34
6/11/21
Observer-Observable
Class Diagram0 2016/03/02 powered by Astah
java.util
Observable
Observer
+ addObserver() : void
+ update() : void notifies + setChanged() : void
+ notifyObservers() : void
UnitObserver Task
tasks
69
Java Observer-Observable
class Observable{
void addObserver(..){}
void deleteObserver(..){}
void deleteObservers(){}
int countObservers() {}
void setChanged() {}
void clearChanged() {}
boolean hasChanged() {}
void notifyObservers() {}
void notifyObservers(..) {}
}
70
70
35
6/11/21
Observer-Observable
§ Class Observable manages:
w registration of interested observers by means of
method addObserver()
w sending the notification of the status change to
the observer(s) together with additional
information concerning the status (event object).
§ Interface Observer allows:
w Receiving standardized notification of the
observer change of state through method
update() accepts two arguments:
– Observable object that originated the notification
– additional information (the event object)
71
Observer-Observable
§ Sending a notification from an
observable element involves two
steps:
w record the fact the the status of the
Observable has changed, by means of
method setChanged(),
w send the actual notification while
providing the additional information (the
event object), by means of method
notifyObservers()
72
36
6/11/21
73
Inheritance
Concerned + Subject (composition) 2020/03/29
Concerned Subject
pkg ObserverComposition
- prop : String
+ update() : void
+ setProp() : void
<<interface>> PropertyChangeSupport
PropertyChangeListener
notifies + addPropertyChangeListener() : void
+ propertyChange() : void + firePropertyChange() : void
1 Composition
Concerned Subject
- prop : int
+ propertyChange() : void
+ setProp() : void
+ addListener() : void
74
74
37
6/11/21
Observer w/Inheritance
S+C inheritance
sd S+C inheritance
2020/03/29
1: addObserver() : void
75
75
C+S composition
Observer w/Composition
sd C+S composition
2020/03/29
1: addListener() : void
1.1: addPropertyChangeListener() : void
2: setProp() : void
2.1: firePropertyChange() : void
2.1.1: propertyChange() : void
1/1
76
76
38
6/11/21
String prop="ini";
}
77
77
78
39
6/11/21
@Override
public void update(Observable src,
Object arg) {
System.out.println("Variation of " +
arg);
}
79
79
@Override
public void propertyChange(
PropertyChangeEvent evt) {
System.out.println("Variation of " +
evt.getPropertyName());
}
80
80
40
6/11/21
Observer Example
/01234231#
!"#$%
!"#$% .$+#
($+#
-$+#
*$+#
&$+#
,$+#
$+#
!# '# )#
!"#$%&#
'"#$%(#
)#"#$%*# 5607289#
81
81
Template Method
§ Context:
w An algorithm/behavior has a stable core
and several variation at given points
§ Problem
w You have to implement/maintain several
almost identical pieces of code
82
82
41
6/11/21
Template Method
Core algorithm, invokes abstract
primitive operations
AbstractClass
templateMethod()
primitiveOperation() ...
primitiveOperation()
...
primitiveOperation()
...
ConcreteClass
primitiveOperation()
83
83
Sorter
sort(Object)
compare()
IntegerSorter
compare()
84
84
42
6/11/21
Example: Sorter
public abstract class Sorter {
public void sort(Object v[]){
for(int i=1; i<v.length; ++i)
for(int j=0; j<v.length-i; ++j){
if(compare(v[j],v[j+1])>0){
Object o=v[j];
v[j]=v[j+1]; v[j+1]=o;
} } }
}
abstract int compare(Object a, Object b);
}
85
85
Example: StringSorter
class StringSorter extends Sorter {
int compare(Object a, Object b){
String sa=(String)a;
String sb=(String)b;
return sa.compareTo(sb);
}
}
Sorter ssrt = new StringSorter();
String[] v={"g","t","h","n","j","k"};
ssrt.sort(v);
86
86
43
6/11/21
Strategy
§ Context
w Many classes or algorithm has a stable
core and several behavioral variations
§ Problem
w Several different implementations are
needed.
w Multiple conditional constructs tangle the
code.
87
87
Strategy
Context Strategy
ContextInterface() algorithmInterface()
ConcreteStrategyA ConcreteStrategyB
algorithmInterface() algorithmInterface()
88
88
44
6/11/21
Collections «Interface»
sort() Comparator
compare(Object a, Object b)
StringComparator IntegerComparator
compare() compare()
89
89
Comparator
– Interface java.util.Comparator
90
90
45
6/11/21
Comparator
class StudentCmp
implements Comparator<Student>{
public int compare(Student a,Student b){
return a.id – b.id;
}
}
91
91
Strategy Consequences
+ Avoid conditional statements
+ Algorithms may be organized in families
+ Choice of implementations
+ Run-time binding
- Clients must be aware of different
strategies
- Communication overhead
- Increased number of objects
92
92
46
6/11/21
Iterator pattern
§ Context
w A collection of objects must be iterated
§ Problem
w Multiple concurrent iterations are possible
w The internal storage must not be exposed
§ Solution
w Provide an iterator object, attached to the
collection, that can be advanced
independently
93
93
Iterator pattern
pkg iterator
<<interface>>
<<interface>>
Iterator
Aggregate <<create>>
+ next() : Object
+ iterator() : Iterator
+ hasNext() : boolean
<<create>> ConcreteIterator
ConcreteAggregate
+ next() : Object
+ iterator() : Iterator
+ hastNext() : boolean
refers to
94
94
47
6/11/21
Visitor
§ Context
w An object structure contains many classes
with differing interfaces.
w Many different operations need to be
performed on the objects
§ Problem
w The operations on the objects depend on
their concrete classes
w Classes could be polluted with several
operations
95
95
Visitor
Visitor
Client viewElemA(ConcreteElemA)
ViewElemB(ConcreteElemB)
ConcreteVisitor1 ConcreteVisitor2
viewElemA(ConcreteElemA) viewElemA(ConcreteElemA)
viewElemB(ConcreteElemB) viewElemB(ConcreteElemB)
Element
accept(Visitor)
ConcreteElemA ConcreteElemB
accept(Visitor) accept(Visitor)
96
96
48
6/11/21
Visitor Example
StatementVisitor
Compiler visitAssignment(Assignment)
visitReference(Reference)
TypeCheckingVisitor CodeGenerationVisitor
visitAssignment(Assignment) visitAssignment(Assignment)
visitReference(Variable) visitReference(Reference)
Statement
accept(Visitor)
Assignment Reference
accept(Visitor) accept(Visitor)
97
97
Visitor Consequences
+ Adding new operations is very easy
+ Behavior is partitioned
+ Can visit class hierarchies
+ State can be accumulated
98
98
49
6/11/21
References
§ M.Fowler, K. Scott, UML Distilled, 3rd
ed. Addison-Wesley, 2003.
§ E. Gamma, R. Helm, R. Johnson, and J.
Vlissides, Design Patterns: Elements of
Reusable Object-Oriented Software.
Reading, MA: Addison-Wesley, 1995.
§ E.Freeman, E.Freeman, K.Sierra,
B.Bates. Head First Design Patterns,
O’Reilly, 2004
99
99
50