36
Larman, chapters 25 and 26 CSE432 Object-Oriented Softw are Engineering Glenn D. Blank, Lehigh University Pure Fabrication and ³Gang of Four´ Design Patterns

Go Design Patterns

Embed Size (px)

Citation preview

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 1/36

Larman, chapters 25 and 26

CSE432

Object-Oriented Software Engineering

Glenn D. Blank, Lehigh University

Pure Fabrication and

³Gang of Four´Design Patterns

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 2/36

Pure FabricationAnother GRASP design pattern

Problem: you must assign a responsibility to a class,but assigning it to a class that already representsa problem domain entity would ruin its lowcoupling and/or high cohesion.

Solution: Assign a highly cohesive set of responsibilitiesto ³made up,´ fabricated class²it does not need torepresent a problem domain concept²in order tosupport high cohesion, low coupling & reuse.

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 3/36

Pure Fabrication: Example

For NextGen POS, there is a requirement tosave the Sale instances in a database.

What does Information Expert tell us to do?  Assign this responsibility to the Sale class,

since Sale has the data that needs to be saved.

But the above solution leads to:

Low Cohesion: database tasks not related to SaleHigh Coupling: Should Sale interface with database?

Low Reusability: General task of saving to adatabase is one that other classes may share.

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 4/36

Instead, fabricate a new class,

PersistentStorage

Invent a new class that is solely responsible

for saving objects.

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 5/36

Pure Fabrication Benefits

High Cohesion: fabricated class focuses on a

very specific responsibility

Reuse: fine-grained pure fabrication classeswith specific responsibilities are relatively

easy to understand and reuse in other 

applications

Pure fabrication principle leads to many other 

reusable design patterns, including most of 

the Gang of Four patterns

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 6/36

1995

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 7/36

The ³gang of four´ (GoF)

Design Patterns book catalogs 23 different patterns

Solutions to different classes of problems, in C++ & Smalltalk

Problems and solutions are broadly applicable, used by many

people over many years Patterns suggest opportunities for reuse in analysis,

design and programming

GOF presents each pattern in a structured format

What do you t 

hink of t 

his format? Pros and cons?

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 8/36

Elements of Design Patterns

Design patterns have 4 essential elements:

Pattern name: increases vocabulary of designers

Problem: intent, context, when to apply

Solution: UML-like structure, abstract code

Consequences: results and tradeoffs

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 9/36

Design Patterns are NOT

Data structures that can be encoded in classes and

reused as is (i.e., linked lists, hash tables)

Complex domain-specific designs

(for an entire application or subsystem)

If they are not familiar data structures or complex

domain-specific subsystems, w hat are t hey ?

They are:

³Descriptions of communicating objects and classes

that are customized to solve a general design problem

in a particular context.´

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 10/36

Three Types of GoF Patterns

Creational patterns: Deal with initializing and configuring objects

Structural patterns: Composition of classes or objects Decouple interface and implementation of classes

Behavioral patterns: Deal with dynamic interactions among societies of objects

How they distribute responsibility

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 11/36

Structural patterns

 Assemble objects to realize new functionality Exploit flexibility of object composition at run-time

Not possible with static class composition

Example: Proxy Proxy acts as convenient surrogate or placeholder 

for another object.

Examples? Remote Proxy: local representative for object in a

different address space Virtual Proxy: represent large object that should be

loaded on demand

Protected Proxy: protect access to the original object

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 12/36

Structural Patterns Adapter:

Converts interface of a class into one that clients expect

Bridge: Links abstraction with many possible implementations

Composite: Represents part-whole hierarchies as tree structures

Decorator :

 Attach additional responsibilities to object dynamically

Facade:

Simplifies the interface for a subsystem Flyweight:

Shares many fine-grained objects efficiently

Proxy:

Provides a surrogate or placeholder for another object

to control access to it

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 13/36

Adapter pattern

Problem: How to resolve incompatible interfaces or 

provide a stable interface to similar components

with different interfaces?

Solution: Convert original interface component intoanother one through an intermediate adapter.

Use interfaces and polymorphism to add indirection

to varying APIs

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 14/36

POS example: Instantiate

adapters for external services

T a x M a s t e r A d a p t e r  

g e t T a x e s ( S a l e ) : L i s t o f T a x L i n e I te m s

G o o d A s G o l d T a x P r o

  A d a p t e r  

g e t T a x e s ( S a l e ) : L is t o f T a x L i n e I t e m s

« i n t e r f a c e »

I T a x C a l c u l a t o r A d a p t e r  

g e t T a x e s ( S a l e ) : L i s t o f T a x L i n e I t e m s

 A d a p t e r s u s e i n t e r f a c e s a n d

p o l y m o r p h i s m t o a d d a l e v e l o f  

i n d i re c t i o n t o v a r y i n g A P I s i n o t h e r  

c o m p o n e n t s .

S A P A c c o u n t i n g A d a p t e r  

p o s t R e c e i v a b le ( C r e d it P a y m e n t )

p o s t S a l e ( S a l e )

. . .

G r e a t N o r t h e r n A c c o u n t i n g A d a p t e r  

p o s t R e c e i v a b le ( C r e d it P a y m e n t )

p o s t S a l e ( S a l e )

. . .

« i n t e r f a c e »

I A c c o u n t i n g A d a p t e r  

p o s t R e c e i v a b le ( C r e d it P a y m e n t )

p o s t S a l e ( S a l e )

. . .

« i n t e r f a c e »

I I n v e n t o r y A d a p t e r  

. . .

« i n t e r f a c e »

I C r e d i t A u t h o r i z a t i o n S e r v i c e

  A d a p t e r  

r e q u e s t A p p r o v a l( C r e d it P a y m e n t ,T e r m i n a lI D , M e r c h a n tI D )

. . .

Fig. 26.1

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 15/36

Using an Adapter: adapt postSale

request to SOAP XML interface

:  

e g is te r :¡  

¢  

£  

¢  

c c o u n t i n g¢  

d a p t e r  

p o s t¡  

a l e ( s a l e )

¤   a k e £   a y ¤   e n t

th e¢  

d a p t e r a d a p t s to

i n te r f a c e s i n o t h e r c o ¤   p o n e n t s

¡  

O¢  

£   o v e r  

H T T £  

x x x

. . .

« a c t o r »

:¡  

¢  

£  

¡  

y s t e ¤  

Fig. 26.2

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 16/36

Reduces coupling to implementation specific details

Polymorphism and Indirection reveals essential

behavior provided

Including name of design pattern in new class (e.g.,

TaxMasterAdapter) in class diagrams and code

communicates to other developers in terms of 

known design patterns

Benefits of Adapter pattern

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 17/36

Creational Patterns

Singleton: Guarantee access to a singular (sole) instance

Simple Factor y: Create specialized, complex objects

Abstract Factor y: Create a family of specialized factories

Factor y Method: Define an interface for creating anobject, but let subclasses decide which class to instantiate

Builder : Construct a complex object step by step

Prototype: Clone new instances from a prototype

Lazy initialization: Delay costly creation until it is needed

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 18/36

Singleton pattern (creational)  A class with just instance and provide a global point of access

Gl obal Variabl es can be dangerous! (side effects, break information hiding)

class Singleton

{ public:

static Singleton* getInstance();

protected: //Why are the following protected?

Singleton();

Singleton(const Singleton&);

Singleton& operator= (const Singleton&);

private: static Singleton* instance;

};

Singleton *p2 = p1->getInstance();

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 19/36

Simple Factor y pattern

Context/Problem

Who should be responsible for creating objectswhen there are special considerations, such as

complex logic,a desire to separate the creationresponsibilities for better cohesion, and so forth

Solution

Create a Pure Fabrication to handle the creation

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 20/36

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 21/36

Advantages of Factor y Objects?

Separates responsibility of complex creation into

cohesive helper classes

Hides complex creation logic, such as

initialization from a file

Handles memory management strategies,

such or recycling or caching

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 22/36

Use Singleton to create a Factor y

1

¥  ervicesFactory

instance :¥  

ervicesFactory

account ing¦  

dapter : I¦  

ccount ing¦  

dapter  

inventory¦  

dapter : I Inventory¦  

dapter  

ta x§  

alcu la tor  ¦  

dapter : ITax§  

alcu la tor  ¦  

dapter  

getInstance() :¥  

ervicesFactory

get¦  

ccount ing¦  

dapter( ) : I¦  

ccount ing¦  

dapter  

getInventory¦  

dapter( ) : I Inventory¦  

dapter  

getTax§  

alcu la tor  ¦  

dapter( ) : ITax§  

alcu la tor  ¦  

dapter  

.. .

singleton static

attr ibute

sing le ton

static

 ̈ ethod

// static ̈ 

ethod

publ ic sta t ic synchronized¥  

ervicesFactory getInstance()

{

i f ( instance == nul l )

instance = new¥  

ervicesFactory( )

re turn instance

}

U ©   L notat ion: in a

class box, anunder l ined attr ibute or  

 ̈ ethod ind icates a

stat ic (c lass leve l)

 ̈  e  ̈  ber , ra ther than

an instance ̈ 

e ̈ 

ber 

U©  

L notat ion: th is '1 ' can opt ional ly be us ed to

ind icate that on ly one instance w i l l be created (asing le ton)

Figure 26.6

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 23/36

Adapter, Factor y and Singleton

working together 

:  

egister accounting

  

dapter:

  

  

  

  

ccounting

  

dapter 

post    ale( sale )

  ake

  ay

  ent

  O

  

  over 

H TT  

xx x

:  

egister 

1:  

ervicesFactory

accounting  

dapter =

get  

ccounting  

dapter 

:    tore

createcreate

:  

  

  

  

ccounting  

dapter 

:  

ay  

entcreate(cashTendered)

«actor»

:  

  

  yste

  

create

Figure 26.8

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 24/36

Behavioral Patterns Chain of Responsibility:

Request delegated to the responsible service provider 

Command:

Request or Action is first-class object, hence storable

Iterator :  Aggregate and access elements sequentially

Interpreter :

Language interpreter for a small grammar 

Mediator :

Coordinates interactions between its associates Memento:

Snapshot captures and restores object states privately

Whic h

ones do you t hink you

have seen some

w here?

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 25/36

Behavioral Patterns (cont.)

Observer :

Observers update automatically when observedobject changes

State:

Object whose behavior depends on its state

Strategy:

 Abstraction for selecting one of many algorithms

Template Method:

 Algorithm with some steps supplied by derived class Visitor :

Operations applied to elements of a heterogeneousobject structure

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 26/36

Strategy design pattern

Problem: How to design a family of algorithms or policies

that are essentially the same but vary in details?

Solution: "Define a family of algorithms, encapsulate each

one, and make them interchangeable." [Gamma, p315]

Use abstraction and polymorphism to show high levelalgorithm and hide varying implementation details

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 27/36

Multiple SalePricing St r ategy classes

with polymorphic g etT otal method

Percent  

i scount

P ricing    t rategy

percentag e : f loat

getTotal ( s :    ale ) :  

oney

  bsolute

  i scount

OverThresho ld

P ricing  

t rategy

d iscount :  

oney

threshold :  

oney

getTotal ( s :  

ale ) :  

oney

«interface»

I  

a leP ricing  

t rategy

getTotal (  

ale ) :  

oney

{

return s.getP re  

iscountTotal () * percentag e

}

???

P ricing    t rategy

.. .

.. .

{

pdt := s .getP re  

iscountTotal ()

i f ( pdt < threshold )

re tu rn p d t

else

re tu rn pd t - d i sc oun t

} Figure 26.9

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 28/36

Observer pattern

Intent: Define a one-to-many dependency between objects

so that when one object changes state, all its dependentsare notified and updated automatically

Used in Model-View-Controller framework Model is problem domain

View is windowing system

Controller is mouse/keyboard control

H ow can Observer pattern be used in ot her 

appl ications? JDK¶s Abstract Window Toolkit (listeners)

Java¶s Thread monitors, notify(), etc.

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 29/36

Structure of Observer Pattern

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 30/36

Patterns in software libraries

 AWT and Swing use Observer pattern

Iterator pattern in C++ template library & JDK

Façade pattern used in many student-oriented libraries to simplify more

complicated libraries!

Bridge and other patterns recurs in

middleware for distributed computingframeworks

«

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 31/36

Command pattern Synopsis or Intent: Encapsulate a request as an object,

thereby letting you parameterize clients with different requests,queue or log requests, and support undoable operations

Context: You want to model the time evolution of a program: What needs to be done, e.g. queued requests, alarms, conditions

for action What is being done, e.g. which parts of a composite or distributed

action have been completed

What has been done, e.g. a log of undoable operations

What are some appl ications t hat need to support undo? Editor, calculator, database with transactions

Perform an execute at one time, undo at a different time Solution: represent units of work as Command objects

Interface of a Command object can be a simple execute() method

Extra methods can support undo and redo

Commands can be persistent and globally accessible, just likenormal objects

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 32/36

Command pattern, continued Structure:

Participants (the classes and/or objects participating in this pattern):Command (Command) declares an interface for executing an operation

ConcreteCommand defines a binding between a Receiver object and an action

implements Execute by invoking the corresponding operation(s) on Receiver 

Invoker asks the command to carry out the request

Receiver knows how to perform operations associated with carrying out the request

Client creates a ConcreteCommand object and sets its receiver 

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 33/36

Command pattern, continued

Consequences:

You can undo/redo any Command

Each Command stores what it needs to restore state

You can store Commands in a stack or queue

Command processor pattern maintains a history

It is easy to add new Commands, because you do

not have to change existing classes Command is an abstract class, from which you derive

new classes

execute(), undo() and redo() are polymorphic functions

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 34/36

More software patterns

Language idioms (low level, C++): Jim Coplein, Scott Meyers

I.e., when should you define a virtual destructor?

 Architectural (systems design): layers, reflection, broker 

Reflection makes classes self-aware, their structure andbehavior accessible for adaptation and change:Meta-level provides self-representation, base leveldefines the application logic

J ava Enterprise Design Patterns (distributed transactionsand databases) E.g., ACID Transaction: Atomicity (restoring an object after a

failed transaction), C onsistency, I solation, and Durability

Analysis patterns (recurring & reusable analysis models, fromvarious domains, i.e., accounting, financial trading, health)

Process patterns (software process & organization)

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 35/36

Benefits of Design Patterns

Design patterns enable large-scale reuse of software architectures and also help documentsystems

Patterns explicitly capture expert knowledge anddesign tradeoffs and make it more widely available

Patterns help improve developer communication

Pattern names form a common vocabulary

8/8/2019 Go Design Patterns

http://slidepdf.com/reader/full/go-design-patterns 36/36

Web Resources

http://home.earthlink.net/~huston2/dp/

http://www.dofactory.com/

http://hillside.net/patterns/