Design Patterns
illustrated
Herman Peeren May 31st 2010
(DP-illustrations: Nelleke Verhoeff)
Design Patterns
●● recipes against common (OO-) programming problems
●● code reuse: no need to reinvent the wheel
●● common language
●● GOF: 23 “classical” patterns
classic,
The Book
very nice!
The one constant in software development:
The one constant in software development:
CHANGE!
The one constant in software development:
CHANGE!
I knew it ...
Ideal: code as modular black boxes
Wish list and OOP-principles
●● loose coupling: 1 change = ceteris paribus
●● code reuse (is not the same as copy/paste)
●● open for extension, closed for modification
●● encapsulate what varies
●● single responsibility principle
●● program against an interface not against an imple-
mentation. Dependency injection
●● prefer composition over inheritance
(in fact this is all the same with different words)
Avoid: tight coupling!
It might get you into trouble...
Beware of:
Code
smells!
some code smells:
1. duplicate code: DRY
2. long method, huge class: SRP
3. combinatorial explosion (similar classes)
4. conditional complexity, switch statements
5. “exhibitionistic” classes
some code smells:
1. duplicate code: DRY
2. long method, huge class: SRP
3. combinatorial explosion (similar classes)
4. conditional complexity, switch statements
5. “exhibitionistic” classes
Classic pattern categories
creational, structural and behavioral patterns:
●● creational: object instantiation
●● structural: larger structures of classes or objects
●● behavioral: interaction and distribution of responsibility
Creational design patterns
●● Factory Method: Allow subclasses to “decide”
which class to instantiate.
●● Abstract Factory: Encapsulate a set of analo-
gous factories that produce families of objects.
●● Builder: Encapsulate the construction of com-
plex objects from their representation; so, the
same building process can create various repre-
sentations by specifying only type and content.
●● Singleton: Ensure that only a single instance of
a class exists and provide a single method for
gaining access to it.
●● Prototype: Create an initialized instance for
cloning or copying.
Factory Method
Provide an interface for the creation of objects.
Allow subclasses to “decide” which class to instantiate.
c
Abstract Factory
Povide an interface for creating families of related
or dependent objects. A factory for factories.
c
Builder
Seperate the construction process (how) of a complex object
from the concrete representations (what).
c
Singleton
Ensure a class only has one instance, and provide a global
point of access to it.
Oh, I’m so
loooooooonly
c
Joomla!
●● JFactory: a class with static methods to instantiate objects
like JDatabase, JUser, JDocument, JTemplate, etc.
●● most of those methods are singletons
Nooku
●● KFactory: any class can be instantiated
●● get() = singleton, tmp() = any instantiation
“Every
advantage
has its
disadvantages”
(free to Johan Cruyff,
Dutch Football Pattern Designer
and Ajax-fan...)
Prototype
Make variations on copies of a basic-object.
COPY-SERVICE
c
Structural design patterns
●● Adapter: Adapt an interface to an expected
interface.
●● Bridge: Decouple an interface from its
implementation.
●● Composite: Create a tree structure for
part-whole hierarchies.
●● Decorator: Extend functionality dynamically.
●● Facade: Simplify usage by defining a high-level
interface.
●● Flyweight: Support fine-grained objects
efficiently by sharing.
●● Proxy: Represent an object with another object
for access control.
Adapter (= Wrapper)
c Adapt an interface to an expected interface.
Joomla!
●● new in 1.6: JAdapter and JAdapterInstance
●● JUpdateAdapter extends JAdapterInstance
JUpdaterExtension & JUpdaterExtension
extend JUpdateAdapter
wanted: documentation and examples!
what does it adapt?
Bridge
Decouple an abstraction from its implementation.
COLA
1 LITER 1 LITER
COLA
1 LITER 1 LITER
COLA
MILK
COLA
MILK COLA
MILK
c
Composite
Create a tree structure for part-whole hierarchies. A node is also a
(part of a) tree. Recursive:
c
Decorator
Add extra functionallity (at runtime),
while keeping the interface the same.
Matroushka’s...
c
Decorator
Nooku
●● KPatternDecorator: a general decorator
●● e.g. extended by KDecoratorJoomlaApplication
Facade
Provide a general (simpler) interface for a set of interfaces.
looks
simple
c
Flyweight
Use one instance of a class to provide many
“virtual” instances.
c
Proxy
Provide a surrogate or placeholder for another object
to control access to it.
c
Behavioral design patterns
●● Chain of Responsibility: Define a method of passing a
request among a chain of objects.
●● Command: Encapsulate a command request in an object.
●● Interpreter: Allow inclusion of language elements in an appli-
cation.
●● Iterator: Enable sequential access to collection elements.
●● Mediator: Define simplified communication between classes.
●● Memento: Save and restore the internal state of an object.
●● Observer: Define a scheme for notifying objects of changes to
another object.
●● State: Alter the behavior of an object when its state changes.
●● Strategy: Encapsulate an algorithm inside a class.
●● Template Method: Allow subclasses to redefine the steps of
an algorithm.
●● Visitor: Define a new operation on a class without changing it.
Command
Encapsulate a command request in an object.
YOU,DO YOUR
TASK!
TASK TASK
LIGHT LIGHT
ON OFF
c
Chain of Responsibility
c
Define a method of passing a request among a chain of objects.
Nooku
●● KCommandChain
+ KCommandContext, KCommandEvent, KCommandHandler and
KCommandInterface
●● N.B.: executes a series of commands
instead of passing a command to a series of handlers
(like in Tapestry e.g.) ...correct me if I’m wrong....
Interpreter
Domain -> (little) language -> grammar -> objects
(DSL)
HÉ! he means:
do this, do that,
and after finishing it,
go there!
c
Iterator
Enable sequential access to collection elements, without showing
the underlying data-structures (array, list, records, etc)
next
next
c
Mediator
c Layer in between: communication via one object.
Memento
Save and restore the internal state of an object.
ME
c
Observer
Notify “subscribers” of changes.
ME
NO ME
ME
WHO?
c
Joomla!
●● JObserver and JObservable
●● JObserver extended by JEvent and that by JPlugin
Nooku
●● KPatternObserver and KPatternObservable
State
Let an object show other methods after a change of internal
state (as if it changes it’s class).
in a.....hick......different state,
....hick....I behave differently....hick.....
c
Strategy
When something can be done in several ways, make those
ways interchangeable.
POSSI-
BILITIES
c
Template Method
The skeleton of an algorithm is fixed, but parts can be filled in
differently.
c
Visitor
Make a kind of plugin-possibility for methods: in that way me-
thods can be added in runtime.
printservice!
c
extra: Mixin
●● Used in Nooku (and a.o. in Ruby and Python)
●● a kind of abstract class that is mixed into another object
●● all methods of the mixin are now part of the object
●● handle with care: beware of tight coupling....
Golden OO-principles
●● encapsulate what varies, OCP
●● 1class, 1 responsibility, SRP
●● program against an interface, not against an imple-
mentation, DIP
●● prefer composition over inheritance
●● loose coupling, modular black boxes
Some books
GOF: 23 “classical” patterns:
very nice!
classic,
The Book
handy
examples
good start
Fowler:
extended
e.g. with
patterns
for web
Fowler: also
known from
refactoring
combi: re-
factoring
& patterns
Resign Patterns:
Ailments of Unsuitable Project-Disoriented Software
Joomla!
Could be improved by studying design patterns and applying
them.
Loose coupling...
Questions?
Contact info:
Herman Peeren
herman@[Link]
© Yepr
The artwork in this presentation is provided under the
Creative Commons Public License for noncommercial use.
[Link]