09.01.2013 Views

CISC 323 Intro to Software Engineering

CISC 323 Intro to Software Engineering

CISC 323 Intro to Software Engineering

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>CISC</strong> <strong>323</strong><br />

<strong>Intro</strong> <strong>to</strong> <strong>Software</strong> <strong>Engineering</strong><br />

Week 6: Design Patterns


<strong>CISC</strong> <strong>323</strong><br />

<strong>Intro</strong> <strong>to</strong> <strong>Software</strong> <strong>Engineering</strong><br />

L ec t u r e 6-1<br />

I n t r o d u c t i o n t o D es i g n P a t t er n s


• R ec a l l<br />

£<br />

¡¢<br />

£ ¤<br />

¥¦<br />

§¤<br />

¨©<br />

Review of Quality Attributes<br />

– R e q u i r e m e n t s a n a l y s i s d e t e r m i n e s d e s i r e d q u a l i t y<br />

a t t r i b u t e s o f s y s t e m<br />

– W h e n d e s i g n i n g s y s t e m , a t t e m p t t o<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

���<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

� �<br />

� �<br />

����<br />

¦ � �<br />

�<br />

£<br />

�¢<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

�<br />

�<br />

� ¨¦<br />

���<br />

��<br />

��<br />

�<br />

��� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

� �� � �<br />

�<br />

� �<br />

���<br />

��<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

��� �<br />

– S o m e a t t r i b u t e s a m e n a b l e t o m a t h e m a t i c a l<br />

�<br />

�<br />

e x p r e s s i o n ( p e r f o r m a n c e , a v a i l a b i l i t y ) , o t h e r s l e s s<br />

s o ( m o d i f i a b i l i t y )<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Example Quality Attributes<br />

• P e r f o r m a n c e<br />

• A v a i l a b i l i t y<br />

• S e c u r i t y<br />

• M o d i f i a b i l i t y<br />

• U s a b i l i t y<br />

• T e s t a b i l i t y<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Design Choices Trade Off<br />

Quality Attributes<br />

• E . g . , t o o b t a i n p e r f o r m a n c e , m a y n e e d t o u s e<br />

a v e r y c o m p l e x a l g o r i t h m , r e d u c i n g<br />

m o d i f i a b i l i t y<br />

• E . g . , t o o b t a i n a v a i l a b i l i t y , m a y n e e d t o<br />

r e p l i c a t e d a t a s o u r c e s , r e d u c i n g s e c u r i t y<br />

• T h e r e f o r e , d e s i g n c h o i c e s r e l y o n k n o w i n g<br />

r e q u i r e d t a r g e t s f o r q u a l i t y a t t r i b u t e s<br />

– A t w h a t p o i n t i s s e c u r i t y s u f f i c i e n t ?<br />

– A t w h a t p o i n t i s s y s t e m s u f f i c i e n t l y f a s t ?<br />

– … E t c .<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Design Patterns<br />

• S o f t w a r e a r c h i t e c t u r e n o r m a l l y c o v e r s t h e<br />

l a r g e -s c a l e d e s i g n o f s o f t w a r e s y s t e m s<br />

• W i t h i n a r c h i t e c t u r a l c o m p o n e n t s , i t c a n b e<br />

u s e f u l t o a p p l y m i c r o -a r c h i t e c t u r e s t o h e l p<br />

d e s i g n t h e s e c o m p o n e n t s<br />

– S o m e t i m e s c a l l e d d e s i g n p a t t e r n s<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Design Patterns<br />

• A d e s i g n p a t t e r n i s a s e t o f r u l e s o f h o w t o<br />

s t r u c t u r e c o d e i n o r d e r t o s o l v e a p a r t i c u l a r<br />

c l a s s o f p r o b l e m<br />

• P r o v i d e s v o c a b u l a r y t o d i s c u s s d e s i g n<br />

• P a r t i c u l a r l y s u i t e d t o O O d e s i g n a s p a t t e r n s<br />

c a n b e e x p r e s s e d i n t e r m s o f c l a s s e s ,<br />

a s s o c i a t i o n s<br />

• D e s i g n p a t t e r n s n o r m a l l y h e l p i n i m p r o v i n g a t<br />

l e a s t o n e q u a l i t y a t t r i b u t e , p e r h a p s a t t h e<br />

e x p e n s e o f o t h e r s<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��


• P r o b l e m<br />

£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Example: the Publish and<br />

Subscribe Design Pattern<br />

– A d a t a s o u r c e i s s h a r e d b y a n u m b e r o f c l i e n t s<br />

– M u l t i p l e c l i e n t s d e p e n d o n t h e v a l u e o f t h e d a t a<br />

s o u r c e<br />

– M o d i f i a b i l i t y a t t r i b u t e i m p o r t a n t<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Concrete Example: Expense<br />

Report<br />

Item $US Cost $Cdn Cost Total cost ($Cdn)<br />

Air $670 $670<br />

Hotel $980 $1470<br />

Meals $70 $105<br />

TOTAL $1050 $670 $1245<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

Forms-based interface for<br />

calculating expense reports.<br />

¨¦<br />

� �<br />

��


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Concrete Example: Expense<br />

Report<br />

Item $US Cost $Cdn Cost Total cost ($Cdn)<br />

Air $670 $670<br />

Hotel $980 $1470<br />

Meals $70 $105<br />

TOTAL $1050 $670 $1245<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

Items depend on value of exchange rate. If<br />

exchange rate changes, these values should<br />

change <strong>to</strong>o.<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

� �<br />

��<br />

¡


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Dependencies<br />

$US cost of<br />

hotel<br />

depends<br />

£�<br />

¦<br />

¨��<br />

�<br />

�<br />

��<br />

��<br />

$Cdn cost of<br />

hotel<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

Exchange<br />

Rate<br />

depends<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

depends<br />

¨¦<br />

� �<br />

��<br />

$Cdn cost of<br />

meals<br />

$US cost of<br />

meals<br />

depends


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Problem<br />

• W h e n e x c h a n g e r a t e m o d i f i e d , m u s t u p d a t e v a l u e s o f<br />

a l l c o m p o n e n t s t h a t d e p e n d o n i t<br />

�£<br />

�¥<br />

£�<br />

¦<br />

¨��<br />

¡<br />

¢�<br />

¥ £<br />

¢¤£<br />

¡<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¥ £<br />

¦¤§<br />

©<br />

$US cost of<br />

hotel<br />

£ �<br />

depends<br />

�<br />

�<br />

�<br />

�¥<br />

£<br />

�<br />

¨©<br />

�<br />

�<br />

�¤�<br />

§<br />

¥ §<br />

��<br />

$Cdn cost of<br />

hotel<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�<br />

¨<br />

£ � �<br />

�<br />

¢���<br />

Exchange<br />

Rate<br />

depends<br />

�¢<br />

� ¦ �<br />

�<br />

� �<br />

£<br />

¢ �<br />

§<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

§ ¨<br />

�¨<br />

depends<br />

§<br />

¨¦<br />

� �<br />

��<br />

¦� �<br />

��<br />

�<br />

£<br />

�<br />

��<br />

$Cdn cost of<br />

meals<br />

��<br />

��<br />

���<br />

$US cost of<br />

meals<br />

depends<br />

�¤£<br />

�<br />

£<br />

�<br />

� §<br />

�<br />

£<br />

�<br />

¢¤�<br />

�<br />

�<br />

�<br />

�£


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Solution: Publish and<br />

Subscribe Design Pattern<br />

• A s o u r c e c o m p o n e n t<br />

c o n t a i n s d a t a o n w h i c h<br />

a s e t o f c l i e n t<br />

c o m p o n e n t s d e p e n d<br />

( e . g . , c u r r e n t e x c h a n g e<br />

r a t e )<br />

• T h e c l i e n t c o m p o n e n t s<br />

s u b s c r i b e t o c h a n g e s i n<br />

t h e d a t a<br />

• T h e s o u r c e c o m p o n e n t<br />

p u b l i s h e s a n y c h a n g e s<br />

i n t h e d a t a<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

¡ �<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

(1) Client<br />

component<br />

subscribes <strong>to</strong><br />

changes in<br />

exchange rate<br />

$Cdn cost of<br />

hotel<br />

©§<br />

� �¡<br />

¡<br />

Exchange<br />

Rate<br />

(2) Source<br />

component<br />

publishes<br />

changes in<br />

exchange rate<br />

¡


• A d v a n t a g e s<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

�<br />

� �<br />

£<br />

�<br />

© ¥<br />

�<br />

¢¤£<br />

£<br />

Solution: Publish and<br />

� ��<br />

�©<br />

Subscribe Design Pattern<br />

¡ ©<br />

¢ §<br />

¥<br />

£<br />

�¤£<br />

�<br />

£<br />

�<br />

¤�<br />

§<br />

©��<br />

¥ £<br />

¢¤£<br />

¡<br />

¥<br />

��<br />

�� �<br />

�<br />

¥ �<br />

�¥<br />

�<br />

��<br />

�<br />

�<br />

¥ �<br />

¢¤£<br />

�<br />

¥<br />

� £<br />

� ¥<br />

¥ £<br />

¦¤§<br />

�<br />

� §<br />

�<br />

¡ �<br />

� ��<br />

�©<br />

� £<br />

�<br />

§<br />

£<br />

¥<br />

�<br />

£<br />

�<br />

�<br />

�<br />

�<br />

�<br />

¢¤�<br />

£<br />

�<br />

�<br />

£ ¨<br />

�<br />

�<br />

�<br />

�©<br />

£ ¨<br />

�<br />

£<br />

¥<br />

� £<br />

�¨<br />

�£<br />

�<br />

¡<br />

�<br />

§<br />

�¤£<br />

�<br />

�£<br />

�<br />

�<br />

�£<br />

£<br />

¥<br />

¥ �<br />

��<br />

�<br />

£<br />

�<br />

�<br />

¢ §<br />

�<br />

�<br />

£<br />

¥<br />

�<br />

�� �<br />

§<br />

�£<br />

�¥<br />

�<br />

¥<br />

� £<br />

� ¥<br />

�<br />

� §<br />

£<br />

�<br />

� £<br />

¥<br />

�<br />

¥<br />

�<br />

�<br />

£<br />

��<br />

��<br />

�<br />

�<br />

¤<br />

�<br />

�<br />

¢¤�<br />

�<br />

�<br />

� ¥<br />

� £<br />

¥<br />

�<br />

�<br />

¦<br />

�<br />

�§<br />

� � ����<br />

§<br />

�<br />

�<br />

�£<br />

� § �<br />

�<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

(1) subscribe<br />

$Cdn cost of<br />

hotel<br />

Subscriber<br />

©§<br />

� �¡<br />

¡<br />

Publisher<br />

Exchange<br />

Rate<br />

(2) publish


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Implementing Design<br />

Patterns<br />

• D e s i g n p a t t e r n s r e p r e s e n t s s t r a t e g i e s f o r<br />

o r g a n i z i n g c o d e , n o t e x p l i c i t i m p l e m e n t a t i o n s<br />

• A c t u a l i m p l e m e n t a t i o n u s e d m u s t b e<br />

d e t e r m i n e d o n a c a s e -b y -c a s e b a s i s<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

¡ �<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �¡<br />

¡


¡<br />

¢£<br />

¤<br />

¤<br />

¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

§ �<br />

�£<br />

¤<br />

¤<br />

¥<br />

§£ �<br />

�<br />

�<br />

���<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Event-Connec<strong>to</strong>r<br />

Implementation<br />

�<br />

���<br />

����<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

���<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

����<br />

���<br />

���<br />

�<br />

�<br />

�<br />

�<br />

���<br />

����<br />

�<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

Exchange<br />

Rate<br />

$Cdn cost of<br />

hotel<br />

(1) subscribe =<br />

connectAsTarget<br />

(2) publish =<br />

raiseEvent<br />

Subscriber<br />

Publisher


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Code for Target (Subscriber)<br />

Interface<br />

// Target implements this method. It is called by the<br />

// event connec<strong>to</strong>r whenever a new event is fired.<br />

public interface EventTarget {<br />

public void performEvent (EventObject e);<br />

}<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Code for New Event Type<br />

import java.util.EventObject;<br />

public class ExchangeRateChangedEvent extends EventObject {<br />

private float newExchangeRate;<br />

}<br />

public int getNewExchangeRate () {<br />

return newExchangeRate;<br />

}<br />

public ExchangeRateChangedEvent (<br />

Object source, float newRate) {<br />

super (source);<br />

newExchangeRate = newRate;<br />

}<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

EventConnec<strong>to</strong>r (Publisher)<br />

Code<br />

public class EventConnec<strong>to</strong>r {<br />

//There are zero or more targets represented as a vec<strong>to</strong>r<br />

private Vec<strong>to</strong>r targets = new Vec<strong>to</strong>r();<br />

}<br />

// When a new event is raised, the "performEvent" method of<br />

// each target is invoked<br />

public void raiseEvent (EventObject e) {<br />

for (int i=0; i


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

More on Publish/Subscribe<br />

• Basis of the Event-b ased A r c hitec tu r al S ty l e<br />

• G r eatl y im p r oves m od ifiab il ity and<br />

ex tend ib il ity of sy stem s<br />

– A t t h e e x p e n s e o f i n t e r a c t i o n c o m p l e x i t y – w h i c h<br />

m a y m a k e a n a l y s i s m o r e d i f f i c u l t<br />

• U sed in m ost ( al l ) g r ap hic al u ser inter fac e<br />

fr am ew or k s<br />

• A l so ver y p op u l ar in d evel op m ent<br />

envir onm ents ( e. g . I BM Ec l ip se) w her e a<br />

var iety of <strong>to</strong>ol s c an b e easil y integ r ated<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />


aiseEvent<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Sequence Diagram<br />

Publisher Subscriber1 Subscriber2<br />

connectAsTarget<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

connectAsTarget<br />

(change in state<br />

initiated by outside<br />

source or Publisher) performEvent<br />

performEvent<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

�<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Where do Design Patterns<br />

Come From?<br />

• A c tu al l y m ined fr om c od e<br />

– G e n e r a l r u l e - - d e s i g n p a t t e r n m u s t b e s e e n i n a t<br />

l e a s t t h r e e r e a l s y s t e m s b e f o r e i t i s c o n s i d e r e d t o<br />

b e a d e s i g n p a t t e r n<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

Reading<br />

• B a h r a m i m e n t i o n s d e s i g n p a t t e r n s , n o d e t a i l s<br />

• S u p p l e m e n t a r y t e x t f o r t h i s t o p i c :<br />

��<br />

�<br />

�¤�<br />

�<br />

¤<br />

� �<br />

¡£¢<br />

¤¦¥<br />

��<br />

��<br />

�<br />

��<br />

¢<br />

�<br />

§<br />

��¢<br />

�<br />

�<br />

�<br />

¨£©<br />

�©��<br />

§ ©¢<br />

¤¦¥ �<br />

�<br />

�¦�<br />

�£<br />

� § �<br />

�<br />

¤<br />

� �<br />

�©<br />

���<br />

� �<br />

�¦�<br />

�<br />

¤¦�<br />

���<br />

�<br />

�¦�<br />

�<br />

�¦�<br />

�<br />

��<br />

�<br />

�<br />

� ©<br />

�<br />

�<br />

¤<br />

�<br />

��<br />

¢ ©¢ �<br />

�<br />

• p a g e s f o r e a c h d e s i g n p a t t e r n l i s t e d o n w e b & s l i d e s<br />

• p a g e s f o r p u b l i s h / s u b s c r i b e p a t t e r n : 2 9 3 -3 0 3<br />

��¥<br />

©<br />

�<br />

� �<br />

��<br />

§ �<br />

��<br />

�¢<br />

�¢ � � �<br />

� �<br />

©<br />

�<br />

�<br />

�¢<br />

• n o t e : t h i s t e x t u s e s C + + / S m a l l t a l k , U M L -l i k e n o t a t i o n<br />

�<br />

�<br />

§ ©¢<br />

�<br />

��<br />

� � ��<br />

���<br />

�<br />

��<br />

����<br />

�<br />

�<br />

§ �<br />

�<br />

¤ ¥<br />

§£ �<br />

� � �<br />

��<br />

�<br />

�<br />

�<br />

���<br />

��<br />

�<br />

� ��<br />

��<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

§�<br />

�<br />

� §��<br />

��<br />

��<br />

� �<br />

©<br />

�<br />

��<br />

�<br />

�<br />

��<br />

©<br />

�<br />

¤<br />

� �<br />

�<br />

� �<br />

�<br />

� §��<br />

��<br />

���<br />

� ���<br />


<strong>CISC</strong> <strong>323</strong><br />

<strong>Intro</strong> <strong>to</strong> <strong>Software</strong> <strong>Engineering</strong><br />

Lecture 6-2<br />

A d a p ter, F a ç a d e, A b s tra ct F a c<strong>to</strong> ry , a n d<br />

F l y w ei g h t D es i g n P a ttern s


• M o ti v a ti o n<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Adapter Design Pattern<br />

[Gamma et al., pp 139-150]<br />

– S o m e t i m e s a c l a s s i m p l e m e n t s f u n c t i o n a l i t y s i m i l a r<br />

t o w h a t a n a p p l i c a t i o n r e q u i r e s , b u t n o t t h e<br />

c o r r e c t i n t e r f a c e f o r t h a t a p p l i c a t i o n<br />

– E . g . W e w i s h t o i m p l e m e n t a B o o k L i s t c l a s s<br />

i m p l e m e n t i n g a l i s t o f t e x t b o o k u s e d i n a c o u r s e<br />

int getNumBooks()<br />

Book getBook (int n)<br />

void addBook (Book newBook)<br />

– T h e s e o p e r a t i o n s a r e v e r y s i m i l a r t o t h e<br />

o p e r a t i o n s i n t h e p r e d e f i n e d V e c t o r c l a s s<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

�<br />

¡


• O p ti o n s :<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Adapter Design Pattern<br />

– I m p l e m e n t B o o k L i s t f r o m s c r a t c h<br />

¤�<br />

§<br />

©��<br />

¡<br />

– U s e V e c t o r<br />

¡<br />

�<br />

¥ ¦<br />

¢¤£<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

§<br />

�<br />

©¤�<br />

¦<br />

¨§<br />

¦ �<br />

�<br />

� ¦<br />

�<br />

¦<br />

¨<br />

� ¦ ©<br />

�<br />

�<br />

��<br />

– A d a p t V e c t o r t o B o o k L i s t i n t e r f a c e<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� � ����<br />

¥�<br />

�<br />

§<br />

¦<br />

©<br />

�<br />

¦ � §<br />

�£<br />

� § �<br />

�¦<br />

���<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

�<br />

��<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

©<br />

�<br />

¨<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Adapter<br />

• T w o w a y s o f a d a p t i n g t h e V e c t o r<br />

– C l a s s a d a p t e r<br />

¤�<br />

§<br />

©��<br />

¡<br />

�<br />

� �<br />

¨<br />

¦<br />

– O b j e c t a d a p t e r<br />

¡<br />

� �<br />

¨<br />

¦<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

§<br />

§<br />

�<br />

©<br />

§<br />

� ¦<br />

�<br />

�<br />

�<br />

¦<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

©� §<br />

�¦<br />

��<br />

� � ����<br />

�<br />

©<br />

�<br />

�£<br />

� § �<br />

§<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

�<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Class Adapter<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />


¤<br />

¢ £<br />

¤ ¥<br />

BookList.java<br />

¦ §<br />

¨¥<br />

©�<br />

Class Adapter<br />

public interface BookList {<br />

public int getNumBooks();<br />

public Book getBook(int n);<br />

public void addBook(Book newBook);<br />

}<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />


import java.util.Vec<strong>to</strong>r;<br />

public class BookListClassAdapter<br />

extends Vec<strong>to</strong>r implements BookList {<br />

public int getNumBooks() {<br />

return size();<br />

}<br />

}<br />

public Book getBook(int n) {<br />

return (Book) elementAt(n); BookListClassAdapter.java<br />

}<br />

public void addBook(Book newBook) {<br />

for (int i=0; i


This code simply shows how a book list is instantiated<br />

public class SampleClient {<br />

public static void main (String [] args) {<br />

Book b = new Book (…);<br />

BookList bl = new BookListClassAdapter ();<br />

bl.addBook (b);<br />

System.out.println (“Book list has ” +<br />

bl.getNumBooks() + “ books”);<br />

}<br />

}<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

SampleClient.java<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Class Adapter<br />

• A d a p t e r s i m p l y i n h e r i t s o p e r a t i o n s o f V e c t o r<br />

• C l i e n t s u s e B o o k L i s t i n t e r f a c e , n o t<br />

B o o k L i s t C l a s s A d a p t e r d i r e c t l y<br />

¤�<br />

§<br />

©��<br />

¥ £<br />

¢¤£ ¡<br />

�<br />

��<br />

�<br />

�<br />

¢¨<br />

£ ¥<br />

¦¤§<br />

�<br />

©¤£<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�£<br />

�¨�� �<br />

� � ����<br />

�£<br />

� § �<br />

�<br />

¢ §<br />

© �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

§<br />

¦<br />

©§<br />

�<br />

�<br />

�<br />

���<br />

� ���<br />

��<br />

���<br />

�<br />

����<br />

�<br />

�<br />


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

General Form of Class Adapter<br />

£�<br />

¦<br />

¨��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

�<br />


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Object Adapter<br />

£�<br />

¦<br />

¨��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

�<br />


import java.util.Vec<strong>to</strong>r;<br />

public class BookListObjectAdapter implements BookList {<br />

private Vec<strong>to</strong>r books = new Vec<strong>to</strong>r();<br />

}<br />

Object Adapter<br />

public int getNumBooks() {<br />

return books.size();<br />

}<br />

public Book getBook(int n) {<br />

return (Book) books.elementAt(n);<br />

}<br />

public void addBook(Book newBook) {<br />

for (int i=0; i


This code simply shows how a book list is instantiated<br />

public class SampleClient {<br />

public static void main (String [] args) {<br />

Book b = new Book (…);<br />

BookList bl = new BookListObjectAdapter ();<br />

bl.addBook (b);<br />

System.out.println (“Book list has ” +<br />

bl.getNumBooks() + “ books”);<br />

}<br />

}<br />

£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

£�<br />

¦<br />

¨��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

�<br />

�<br />

SampleClient.java


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

General Form of Object Adapter<br />

£�<br />

¦<br />

¨��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

�<br />


£<br />

¡ ¢<br />

£ ¤<br />

¥ ¦<br />

§¤<br />

¨©<br />

Relation <strong>to</strong> Quality Attributes<br />

• M o d i f i a b i l i t y<br />

– Adapter class provides clean interface <strong>to</strong> clients of<br />

adapted ob j ect<br />

• R e u s a b i l i t y<br />

– T ak es advantag e of adapted class for reu se<br />

• C o r r e c t n e s s<br />

– T ak es advantag e of tested code<br />

£�<br />

¦<br />

¨��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�¢<br />

� ¦ �<br />

£<br />

£ ¤<br />

¦¢ �<br />

�<br />

���<br />

��<br />

¨¦<br />

�<br />


• M o t i v a t i o n<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

The Façade Pattern<br />

[Gamma et al., pp 185-193]<br />

– S om etim es part of a sy stem is itself im plem ented<br />

as a su b sy stem , consisting of a set of ob j ects<br />

– R ath er th an revealing su b sy stem stru ctu re <strong>to</strong> rest<br />

of sy stem , u se faç ade ob j ect <strong>to</strong> provide interface<br />

<strong>to</strong> su b sy stem as a w h ole<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

General Idea<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

client classes<br />

subsystem classes<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

Facade<br />

¡


• E x a m p l e<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

The Façade Pattern<br />

– A stu dent inform ation sy stem provides access <strong>to</strong><br />

fu nctions on<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

¡<br />

�<br />

¢<br />

£¥��<br />

�<br />

¤<br />

¢<br />

£¥¤<br />

¦<br />

�<br />

��<br />

�<br />

�<br />

¢<br />

£¥¤<br />

¦¨§<br />

�<br />

�© �<br />

§<br />

�§<br />

�¥��<br />

¦�©<br />

�<br />

��<br />

���<br />

– I m p l e m e n t e d v i a t h r e e c l a s s e s<br />

�<br />

�<br />

�<br />

�<br />

§<br />

��©<br />

�§�<br />

�¥��<br />

�¦�©<br />

¦§<br />

¤�<br />

�<br />

¦§�<br />

��<br />

� ��<br />

��<br />

� ��<br />

¤<br />

��<br />

��<br />

�<br />

�<br />

��©<br />

�<br />

§<br />

�<br />

¤ �<br />

�<br />

��<br />

���<br />

§<br />

¤ �<br />

�<br />

� � ����<br />

¦<br />

�<br />

�<br />

¦<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�£<br />

� § �<br />

�§<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

�¥��<br />

¦©<br />

�<br />

¤<br />

�<br />

�¥�<br />

���<br />

¤ ¥<br />

§£ �<br />

�¥��<br />

¦©<br />

§<br />

��©<br />

�<br />

§<br />

�<br />

�<br />

���<br />

��<br />

�§ ¦<br />

���<br />

�<br />

£¥�<br />

�<br />

�<br />

¤<br />

©§<br />

�<br />

�<br />

���<br />

�<br />

�<br />

��<br />

���<br />

¦§<br />

�¤<br />

� ��<br />

¦ ��<br />

�<br />

§�<br />

��<br />

�¤<br />

�� �<br />

�<br />

¦<br />

�<br />

�<br />

�<br />

�<br />

� � �¤<br />

��<br />

�¦<br />

�<br />

�<br />

�<br />

��©<br />

�<br />

§<br />

�§<br />

�<br />

���<br />

�¥� �<br />

�<br />

�<br />

�<br />

�©<br />

�<br />

§<br />

�<br />

§<br />

��©<br />

�<br />

§<br />

�<br />

¦§<br />

���


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Student Information System<br />

Classes<br />

class Courses { Courses.java<br />

…<br />

public StudentList getEnrollment (CourseId c) { … }<br />

…<br />

}<br />

class Students { Students.java<br />

…<br />

public CourseList getCourses (StudentId s) { … }<br />

}<br />

class Facilities { Facilities.java<br />

…<br />

public LectureHallId getLectureHall (CourseId c) { … }<br />

}<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Student Information System without<br />

Façade<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

Student Information Subsystem<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Student Information System with<br />

Façade<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

Student Information Subsystem<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Façade Implementation<br />

StudentInformationSystem.java<br />

public class StudentInformation System {<br />

Courses cs;<br />

Students ss;<br />

Facilities fs;<br />

…<br />

public StudentList getEnrollment (CourseId c) {<br />

return cs.getEnrollment (c);<br />

}<br />

}<br />

public CourseList getCourses (StudentId s) {<br />

return ss.getCourses (s);<br />

}<br />

public LectureHallId getLectureHall (CourseId c) {<br />

return fs.getLectureHall (c);<br />

}<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Relation <strong>to</strong> Quality Attributes<br />

• M o d i f i a b i l i t y<br />

– By removing external links <strong>to</strong> subsystem<br />

c omp onents, imp ac t of c h anges <strong>to</strong> subsystem<br />

c omp onents limited <strong>to</strong> subsystem itself<br />

• P e r f o r m a n c e<br />

– S ligh t p erf ormanc e c ost of extra c all ind irec tion<br />

th rough f aç ad e<br />

¤�<br />

§<br />

©��<br />

¡<br />

¨<br />

©�<br />

£<br />

�<br />

¢¤£<br />

¥<br />

�<br />

��<br />

��<br />

¦<br />

�<br />

¡<br />

��<br />

�<br />

¨§<br />

©�<br />

�<br />

��<br />

�<br />

¥�<br />

£<br />

�<br />

¥<br />

�<br />

��<br />

��<br />

�<br />

�<br />

¥<br />

�¨<br />

�¤�<br />

�<br />

�¨<br />

�<br />

§�<br />

� � ����<br />

�£<br />

� § �<br />

©�<br />

©�<br />

¤<br />

¤ ¥<br />

§£ �<br />

¥�¨<br />

§<br />

§<br />

�<br />

�<br />

���<br />

��<br />

¥<br />

� �<br />

§<br />

�<br />

©§<br />

� �<br />

¡ �<br />

§£<br />

�<br />

�<br />

��<br />

¥�<br />

©<br />

©<br />

§<br />

�©�<br />

©<br />

�<br />

©<br />

�<br />

� §<br />

§ �<br />

�¥<br />

��<br />

¥<br />

�¤�<br />

�<br />

¥


¤ ¤ ¥ ¦§<br />

¢£<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©�� �<br />

Another Example: SavitchIn<br />

• I np ut w ith J ava A P I :<br />

�<br />

�<br />

�<br />

• S a v i t c h I n :<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

���<br />

�<br />

��<br />

��<br />

��<br />

��<br />

��<br />

��<br />

���<br />

��<br />

�<br />

�<br />

�<br />

� ��<br />

�<br />

�<br />

� ��<br />

�<br />

��<br />

���<br />

��<br />

��<br />

�<br />

��<br />

�<br />

��<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� ��<br />

�<br />

�<br />

� ��<br />

�<br />

� ��<br />

��<br />

�<br />

� ��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

����<br />

���<br />

��<br />

� ���<br />

��<br />

����<br />

�<br />

�<br />

� ��<br />

� ��<br />

� �<br />

��<br />

�<br />

��<br />

�<br />

�<br />

� ��<br />

�<br />

�<br />

��<br />

§<br />

�£<br />

¤ ¤ ¥<br />

� �<br />

§£ �<br />

���<br />

��<br />

��<br />

�<br />

� ���<br />

� ©§<br />

�<br />

� �<br />

�<br />

��<br />

� � �<br />

��<br />

���<br />

��<br />

�<br />

� � �<br />

��<br />

� ��<br />

��<br />

���<br />

��<br />

�<br />

�<br />

���<br />

���<br />

���<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

�<br />

� �<br />

� ��<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

���<br />

�<br />

� ��<br />

���<br />

�<br />

��<br />

��<br />

�<br />

�<br />

¡


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

Categories of Patterns<br />

• T h e p a t t e r n s w e h a v e s e e n s o f a r a d d r e s s<br />

s t r u c t u r a l p r o b l e m s i n p r o g r a m s<br />

– A d a p t e r - - s t r u c t u r e s p r o g r a m s t o a i d r e u s e<br />

– F a ç a d e - - l o c a l i z e s r e f e r e n c e s t o a s u b s y s t e m ,<br />

a i d i n g m o d i f i a b i l i t y<br />

• A l s o i n t e r e s t i n g a r e<br />

– C r e a t i o n a l p a t t e r n s - - h e l p i n o b j e c t c r e a t i o n<br />

– B e h a v i o u r a l p a t t e r n s - - h e l p m a n a g e r u n t i m e<br />

b e h a v i o u r o f p r o g r a m<br />

�<br />

©��<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�� �<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

���<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

����<br />

§ � �<br />

�<br />

��<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

�<br />

�<br />

�<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

¡


• M o t i v a t i o n<br />

¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

Abstract Fac<strong>to</strong>ry<br />

[Gamma et al., pp. 87-95]<br />

– I m a g i n e y o u h a v e a b o o k o r d e r i n g s y s t e m i n<br />

which you need <strong>to</strong> maintain a list of books<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

���<br />

�<br />

�<br />

��<br />

��<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

� �<br />

���<br />

��<br />

���<br />

�£<br />

� § �<br />

�<br />

– I nitially, you wish <strong>to</strong> maintain a simp le V ec<strong>to</strong>r<br />

�<br />

� � �<br />

�<br />

– H owev er , after the system has been deliv er ed,<br />

you decide you want a data str uctur e that also<br />

��<br />

p er mits books <strong>to</strong> be r ep r esented in sor ted or der<br />

¤<br />

¥ ¤ §£<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� ©§<br />

���<br />

� �<br />

�<br />

� �<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

� �<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

���<br />

���<br />

�<br />

�<br />

¡


import java.util.Vec<strong>to</strong>r;<br />

public class BookListClassAdapter<br />

extends Vec<strong>to</strong>r implements BookList {<br />

public int getNumBooks() {<br />

return size();<br />

}<br />

}<br />

public Book getBook(int n) {<br />

return (Book) elementAt(n);<br />

}<br />

public void addBook(Book newBook) {<br />

for (int i=0; i


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

Abstract Fac<strong>to</strong>ry<br />

• Adding sorting behavior <strong>to</strong> the BookList class<br />

– O p t i o n 1 : M o d i f y B o o k L i s t s o t h a t e v e r y t i m e a<br />

b o o k i s e n t e r e d , t h e V e c t o r i s s o r t e d<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

�<br />

��<br />

��<br />

��<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

���<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� � ��<br />

�<br />

�<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� � �<br />

��<br />

��<br />

�<br />

�<br />

� �� �<br />

� �� �<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

� �<br />

�<br />

��<br />

��<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

� � ����<br />

§ � �<br />

�<br />

�<br />

� �� �<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �� �<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

©§<br />

� �<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��� �<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

� � �<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� � �<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

� � ��<br />

�<br />

�<br />

�<br />

¡


• O p t i o n 2 :<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Abstract Fac<strong>to</strong>ry<br />

– C r e a t e a B o o k L i s t i n t e r f a c e w i t h t h e r e q u i r e d<br />

f u n c t i o n a l i t y o f m a i n t a i n i n g a l i s t o f b o o k s<br />

– C r e a t e a n a b s t r a c t f a c t o r y c l a s s t h a t c r e a t e s a n<br />

i n s t a n c e o f t h e c o r r e c t k i n d o f B o o k L i s t<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �<br />

¡


�<br />

�<br />

�<br />

� �<br />

� �� �© �<br />

�<br />

�<br />

���<br />

�<br />

���<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

� ¨<br />

¦<br />

¢ �<br />

¡£¢<br />

¢<br />

�£�<br />

�<br />

¨¢<br />

¤<br />

¢ £<br />

¤ ¥<br />

�¥<br />

� ��<br />

�<br />

©£�<br />

�<br />

�<br />

¦ ¤¥<br />

��<br />

¦ §<br />

¨¥<br />

©�<br />

�<br />

�£�<br />

��<br />

�<br />

�<br />

¡£¢<br />

¢<br />

��<br />

� � ©<br />

©<br />

�<br />

¡£¢<br />

¢<br />

§<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

¨<br />

©£�<br />

���<br />

� �<br />

��<br />

BookList variants<br />

��<br />

����<br />

�<br />

¤�<br />

§<br />

©��<br />

�<br />

� �<br />

�<br />

¨¢<br />

�<br />

¡£¢<br />

¦ ¤¥<br />

�<br />

�<br />

�<br />

©<br />

¦ ¤¥<br />

��<br />

����<br />

��<br />

�<br />

��<br />

��<br />

��<br />

��<br />

�<br />

��<br />

§<br />

¨<br />

© �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�©���<br />

§<br />

¨�<br />

�<br />

¢<br />

�<br />

©£�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

¡<br />

¦ ¤¥<br />

��<br />

�<br />

� �<br />

�<br />

©<br />

©<br />

©<br />

�<br />

�<br />

��<br />

��<br />

§<br />

¨�<br />

�<br />

©<br />

� �<br />

�<br />

�<br />

�<br />

� ��<br />

©<br />

�© �<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

¡ �<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Problems with Changing<br />

Implementations<br />

• Problem: If we change from the<br />

Vec<strong>to</strong>rBookList <strong>to</strong><br />

SortingVec<strong>to</strong>rBookList<br />

implementation, need <strong>to</strong> ensure<br />

that wherever we create a book list,<br />

we replace “new<br />

Vec<strong>to</strong>rBookList()” with “new<br />

SortingVec<strong>to</strong>rBookList()”<br />

• This could be a large change<br />

– What if source <strong>to</strong> classes creating<br />

book lists is not available?<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Abstract Fac<strong>to</strong>ry<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


¢ £<br />

¤<br />

¤<br />

¥<br />

¦ §<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

§ �<br />

�£<br />

¤<br />

¤<br />

¥<br />

§£ �<br />

�<br />

�<br />

���<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Abstract Fac<strong>to</strong>ry<br />

¡<br />

¢<br />

£¥¤<br />

¦<br />

¤§<br />

¤¨<br />

©<br />

�<br />

��¤<br />

¦<br />

��<br />

��¤<br />

�<br />

���<br />

���<br />

£¥¤<br />

�<br />

��<br />

�¨<br />

¤<br />

©<br />

�¤<br />

©<br />

¦<br />

�¦<br />

�<br />

�©<br />

¦<br />

�<br />

¤<br />

�<br />

�<br />

©<br />

���<br />

�<br />

��<br />

�<br />

�<br />

���<br />

���<br />

©<br />

�<br />

��<br />

�<br />

£¥¤<br />

��<br />

�<br />

�<br />

��<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

¤<br />

�<br />

£�<br />

��<br />

��<br />

£¤<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

¡<br />

�<br />

£���<br />

���<br />

©<br />

¦<br />

�<br />

��¤<br />

�<br />

�<br />

�<br />

£©<br />

�¨<br />

¤<br />

���<br />

¨<br />

¦<br />

�<br />

©<br />

§<br />

©<br />

��<br />

¤<br />

�<br />

����<br />

�<br />

¤<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

¡<br />

�<br />

£¥¤<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

¤<br />

�<br />

�<br />

©<br />

����<br />

¤<br />

�<br />

��<br />

©<br />

�©<br />

�<br />

��¨<br />

�<br />

�<br />

©<br />

�<br />

©<br />

�<br />

�¤<br />

�<br />

�¨<br />

¤<br />

���<br />

¨<br />

¦<br />

�¦<br />

�<br />

�<br />

£¥¤<br />

�<br />

�¨<br />

¨<br />

¤<br />

�<br />

�<br />

��¦<br />

��<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

¡<br />

�¤¨<br />

¤<br />

�<br />

©<br />

��<br />

�<br />

���<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

�¨<br />

¤<br />

©<br />

�¤<br />

�<br />

�¦<br />

�<br />

�©<br />

¦<br />

�<br />

¤<br />

�<br />

�<br />

�<br />

��<br />

�<br />

���<br />

���<br />

�<br />

��<br />

�<br />

�<br />


BookListFac<strong>to</strong>ry<br />

BookListFac<strong>to</strong>ry.java<br />

public interface BookListFac<strong>to</strong>ry {<br />

public BookList createBookList ();<br />

}<br />

class Vec<strong>to</strong>rBookListFac<strong>to</strong>ry<br />

implements BookListFac<strong>to</strong>ry {<br />

public BookList createBookList () {<br />

return new Vec<strong>to</strong>rBookList ();<br />

}<br />

}<br />

Vec<strong>to</strong>rBookListFac<strong>to</strong>ry.java<br />

class Client {<br />

…<br />

BookListFac<strong>to</strong>ry blf;<br />

…<br />

BookList b = blf.createBookList();<br />

}<br />

Client.java


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Extending <strong>to</strong> Multiple<br />

Fac<strong>to</strong>ries<br />

uses<br />

BookListFac<strong>to</strong>ry Client<br />

Vec<strong>to</strong>rBookListFac<strong>to</strong>ry SortingVec<strong>to</strong>rBookListFac<strong>to</strong>ry <br />

BookList<br />

creates creates<br />

The client is provided with an object of type<br />

BookList. This object may be either a<br />

Vec<strong>to</strong>rBookList or a SortingVec<strong>to</strong>rBookList,<br />

depending on which fac<strong>to</strong>ry was used.<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

uses<br />

Vec<strong>to</strong>rBookList SortingVec<strong>to</strong>rBookList<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Extending <strong>to</strong> Multiple<br />

Fac<strong>to</strong>ries<br />

uses<br />

BookListFac<strong>to</strong>ry Client<br />

Vec<strong>to</strong>rBookListFac<strong>to</strong>ry SortingVec<strong>to</strong>rBookListFac<strong>to</strong>ry <br />

BookList<br />

creates creates<br />

The client is provided with an object of type<br />

BookList. This object may be either a<br />

Vec<strong>to</strong>rBookList or a SortingVec<strong>to</strong>rBookList,<br />

depending on which fac<strong>to</strong>ry was used.<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

uses<br />

Vec<strong>to</strong>rBookList SortingVec<strong>to</strong>rBookList


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Extending <strong>to</strong> Multiple<br />

Fac<strong>to</strong>ries<br />

uses<br />

BookListFac<strong>to</strong>ry Client<br />

Vec<strong>to</strong>rBookListFac<strong>to</strong>ry SortingVec<strong>to</strong>rBookListFac<strong>to</strong>ry <br />

BookList<br />

creates creates<br />

The client sees an object of type<br />

BookListFac<strong>to</strong>ry, so does not need <strong>to</strong> know<br />

whether it is using a Vec<strong>to</strong>rBookListFac<strong>to</strong>ry<br />

or a SortingVec<strong>to</strong>rBookListFac<strong>to</strong>ry<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

uses<br />

Vec<strong>to</strong>rBookList SortingVec<strong>to</strong>rBookList<br />

¡


General Form of Abstract<br />

Fac<strong>to</strong>ry


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Relating <strong>to</strong> Quality Attributes<br />

• M o d i f i a b i l i t y<br />

– I n c r e a s e d t h r o u g h u s e o f i n d i r e c t i o n i n c r e a t i o n<br />

p r o c e s s<br />

– C r e a t o r d o e s n o t n e e d t o k n o w e x a c t l y w h a t t y p e<br />

o f o b j e c t i s b e i n g c r e a t e d<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

The Flyweight Pattern<br />

[Gamma et al., pp 195-206]<br />

• S o m e t i m e s o b j e c t s t o o e x p e n s i v e f o r<br />

a p p l i c a t i o n s w h e r e l a r g e n u m b e r s o f o b j e c t s<br />

r e q u i r e d<br />

• F l y w e i g h t o b j e c t s p r o v i d e c h e a p e r o b j e c t<br />

m e c h a n i s m<br />

• I l l u s t r a t e s a b s t r a c t f a c t o r y p a t t e r n<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

¡<br />

�¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� ¡<br />

�¡<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Flyweight<br />

• I n a t e x t e d i t o r , w i s h t o<br />

r e p r e s e n t a s e t o f r o w s , a n d<br />

w i t h i n e a c h r o w a s e t o f<br />

c o l u m n s<br />

• E a c h r o w i n t u r n c o n t a i n s a<br />

s e t o f c h a r a c t e r s<br />

• L o g i c a l l y , e a c h c h a r a c t e r i s<br />

a n o b j e c t<br />

• H o w e v e r , a d o c u m e n t o f<br />

t e n s o f t h o u s a n d s o f<br />

c h a r a c t e r s w o u l d r e q u i r e<br />

t e n s o f t h o u s a n d s o f o b j e c t s<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

¡<br />

�¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

a p p a r e n t<br />

©§<br />

� ¡<br />

�¡


¤<br />

¢ £<br />

¤ ¥<br />

�<br />

�<br />

�<br />

¡<br />

¦ §<br />

¨¥<br />

©�<br />

� ¦<br />

��� �<br />

�¨<br />

�<br />

¨<br />

¥§¦<br />

¤ ¢£<br />

� � �<br />

� ¦<br />

���<br />

�<br />

��¦<br />

�<br />

¥¤<br />

�<br />

¥� �£ ¤<br />

���<br />

�<br />

�<br />

¦� �<br />

�¨<br />

�<br />

���<br />

� ��<br />

�<br />

¨¤<br />

�<br />

�¦�<br />

¨<br />

¤<br />

£<br />

¥¨<br />

�£<br />

�<br />

��<br />

��<br />

�<br />

¦<br />

Flyweight<br />

�<br />

¤�<br />

§<br />

©��<br />

£ �<br />

���<br />

�¥<br />

� ¨�<br />

¨<br />

�<br />

¥§¦�<br />

��<br />

¥<br />

£ ¤<br />

¤<br />

©<br />

�<br />

©��<br />

��<br />

¦<br />

��<br />

¤<br />

¥¨<br />

¥§¦<br />

�<br />

�¥<br />

� ¦<br />

¤<br />

¦<br />

¤ ¨<br />

�¥<br />

¥<br />

�<br />

�<br />

����<br />

�<br />

�<br />

��<br />

�<br />

�<br />

¡<br />

�<br />

£<br />

� �<br />

© ¨<br />

¨<br />

¥¨<br />

¤<br />

��£<br />

�<br />

�<br />

��¦<br />

�<br />

¥<br />

��<br />

���<br />

� �<br />

�<br />

��¦<br />

�<br />

¥¤<br />

¨<br />

�<br />

�¡<br />

¨<br />

¥§¦<br />

�<br />

£<br />

£<br />

�¨�<br />

�¨<br />

¦<br />

�<br />

�¤<br />

�<br />

¨<br />

� ¦<br />

��� �<br />

��<br />

���<br />

¥¨<br />

¤<br />

� ¨�<br />

¦<br />

��<br />

�<br />

�<br />

¤<br />

�<br />

£<br />

¦<br />

�<br />

�¦<br />

�<br />

� ¦<br />

©<br />

¨<br />

¥<br />

� ¦<br />

���<br />

�¥<br />

¨<br />

¤<br />

�<br />

���<br />

� �<br />

¥§¦�<br />

¥�<br />

£<br />

�<br />

��¦<br />

�<br />

¥<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

©<br />

� � ����<br />

�<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

a p p a r e n t<br />

a b c d e f g h i k l m<br />

n o p q r s t u v w x y z<br />

©§<br />

� ¡<br />

�¡


£<br />

¡¢<br />

£ ¤<br />

¥¦<br />

§¤<br />

¨©<br />

£�<br />

¦<br />

¨��<br />

Flyweight<br />

• I n t r i n s i c s t a t e : d a t a t h a t<br />

can be shared by many<br />

i nst ances o f o bj ect<br />

�<br />

���<br />

�<br />

���<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

�<br />

� �<br />

���<br />

�<br />

��<br />

� �<br />

� �<br />

• E x t ri nsi c st at e: sp eci f i c<br />

t o a p art i cu l ar i nst ance<br />

�<br />

���<br />

��<br />

�<br />

� �<br />

�<br />

��<br />

� �<br />

� �<br />

��<br />

�<br />

���<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� ���<br />

����<br />

����<br />

� � �<br />

���<br />

�<br />

�¢<br />

£ £ ¤<br />

� ¦ �<br />

¦¢<br />

��<br />

���<br />

�<br />

a p p a r e n t<br />

a b c d e f g h i k l m<br />

n o p q r s t u v w x y z<br />

¨¦ �<br />

� �<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Flyweight Implementation<br />

create (intrinsicData)<br />

• Client creates flyweight instances using flyweightFac<strong>to</strong>ry<br />

• Fac<strong>to</strong>ry requires intrinsic data as parameter -- e.g., parameter is<br />

“a” <strong>to</strong> create instance of character “a”<br />

• Fac<strong>to</strong>ry returns flyweight object with this intrinsic data<br />

• Client must maintain extrinsic data -- e.g., character font, position<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Relation <strong>to</strong> Quality Attributes<br />

• P e r f o r m a n c e<br />

– S yst ems w i t h t ens/ hu ndreds o f t ho u sands o r mo re<br />

of objects can be prohibitively expensive in<br />

m em ory u se<br />

– F lyw eig ht objects red u ce this expense<br />

• M o d i f i a b i l i t y<br />

– E ncapsu lation of system fu nctionality no long er as<br />

clear<br />

– S eparation of intrinsic/ extrinsic state in<strong>to</strong> d ifferent<br />

objects<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


<strong>CISC</strong> <strong>323</strong><br />

<strong>Intro</strong> <strong>to</strong> <strong>Software</strong> <strong>Engineering</strong><br />

L e c t u r e 6 -3<br />

C o m p o s i t e , I t e r a t o r , a n d B u i l d e r<br />

D e s i g n P a t t e r n s


• I n t e n t<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Composite Design Pattern<br />

[Gamma et. al. pp.163-173]<br />

– T o com pose object in<strong>to</strong> tree stru ctu res that<br />

represent part-w hole hierarchies<br />

– L ets clients treat ind ivid u al objects and<br />

com positions of objects u niform ly<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


• P roblem :<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

�<br />

�<br />

¡<br />

�<br />

¦<br />

�<br />

¥�<br />

¤��<br />

Motivation<br />

¤�<br />

§<br />

©��<br />

� ¨<br />

�<br />

¥<br />

¤<br />

¢<br />

£¤<br />

�<br />

¨§<br />

�<br />

¦ ¥<br />

¦<br />

¤�<br />

�¦<br />

�<br />

�<br />

��<br />

��<br />

¥<br />

§ ¨<br />

¤<br />

� �<br />

¤<br />

�<br />

�<br />

�<br />

�<br />

¤<br />

© �<br />

¥�<br />

¨<br />

�<br />

�<br />

�<br />

¥<br />

¥�<br />

�<br />

¤��<br />

¥<br />

�<br />

©<br />

��<br />

¤<br />

�<br />

¥<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

§<br />

¤<br />

¦<br />

¤ �§ �<br />

¥<br />

¥<br />

�<br />

• S o l u t i o n : U s e t h e c o m p o s i t e d e s i g n p a t t e r n<br />

�<br />

�<br />

¨§<br />

¨§<br />

�<br />

�¦<br />

�<br />

� �<br />

¤ �¦<br />

���<br />

§ ¤<br />

¦<br />

¤�<br />

�¦<br />

�<br />

�<br />

¥<br />

� ¨<br />

© �<br />

�<br />

���<br />

�<br />

�<br />

¨<br />

¤��<br />

�<br />

§<br />

¤<br />

�¨<br />

¦<br />

�<br />

�¤<br />

�¨<br />

¦<br />

© �<br />

� �§<br />

��<br />

¤<br />

� �<br />

¤�<br />

¥�<br />

�<br />

���<br />

�<br />

¨<br />

�<br />

�¤<br />

�¨<br />

��<br />

���<br />

���<br />

¥<br />

�<br />

¤<br />

� �<br />

¤<br />

¤<br />

�<br />

�<br />

¤<br />

¤<br />

�<br />

���<br />

�<br />

�<br />

�<br />

§<br />

¤<br />

¥�<br />

¦<br />

¥<br />

� � ����<br />

�<br />

�<br />

��<br />

£<br />

£ ¥�<br />

�<br />

�<br />

� §<br />

¤��<br />

¥<br />

��� �<br />

����<br />

�<br />

���<br />

¥<br />

¥ ��<br />

�<br />

¥<br />

�£<br />

� § �<br />

�<br />

��<br />

§<br />

¦<br />

¤<br />

��¥<br />

¥<br />

�<br />

¤<br />

¦ ¥<br />

�<br />

§�<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

�<br />

¤<br />

���<br />

¥�<br />

¥<br />

� �<br />

�<br />

�¤<br />

�<br />

� ¥<br />

�<br />

¥ ¦<br />

�<br />

� ¨<br />

¦<br />

¥<br />

¤<br />

�<br />

���<br />

��<br />

�<br />

©�<br />

�<br />

��¨<br />

¤<br />

©§<br />

� �<br />

��<br />

� ¨<br />

�<br />

¤¨<br />

¨<br />

¦ ¥<br />

�¤<br />

� �<br />

�<br />

�<br />

¥<br />

¤��<br />

�<br />

¤��<br />

¤<br />

�<br />

¤<br />

�<br />

£<br />

� ��<br />

�<br />

©<br />

¨<br />

¨©<br />

£<br />

¥<br />

¤¨<br />

�<br />

�<br />

�<br />

�<br />

¤<br />

�<br />

¥�<br />

¥<br />

¥<br />

�<br />

�¤ � ��<br />

�<br />

�©<br />

¨<br />

�<br />

� ¥<br />

©<br />

�<br />

�¤<br />

���<br />

¥<br />

¨<br />

£¤<br />

�<br />

©<br />

¥<br />

§�<br />

� ���<br />

�<br />

§ ¨<br />

¦<br />

¥<br />

¤<br />

¤<br />

���<br />

© �<br />

�<br />

�<br />

��<br />

¨<br />

©<br />

¥<br />

¦<br />

¥<br />

¥<br />

¤<br />

§<br />

¤<br />

¥ ¦<br />

�<br />

�<br />

¤<br />

¥<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Applicability<br />

• U s e t h e C o m p o s i t e p a t t e r n i f …<br />

– Y o u w a n t t o r e p r e s e n t p a r t -w h o l e h i e r a r c h i e s o f<br />

o b j e c t s .<br />

– Y o u w a n t c l i e n t s t o b e a b l e t o i g n o r e t h e<br />

d i f f e r e n c e b e t w e e n c o m p o s i t i o n s o f o b j e c t s a n d<br />

i n d i v i d u a l o b j e c t s . C l i e n t s w i l l t r e a t a l l o b j e c t s i n<br />

t h e c o m p o s i t e s t r u c t u r e u n i f o r m l y .<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


• C o m p o n e n t<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

¡<br />

¥ £<br />

¢¤£<br />

Example: Swing Components<br />

�<br />

���<br />

���<br />

¤�<br />

§<br />

©��<br />

�<br />

¦¨§<br />

©<br />

�<br />

�¤�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

• L e a f ( a t o m i c c o m p o n e n t s )<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �� �<br />

�<br />

�<br />

�<br />

• C o m p o s i t e ( t o p -l e v e l S w i n g<br />

c o n t a i n e r s )<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� ��<br />

�<br />

�<br />

��<br />

��<br />

� §<br />

�<br />

�<br />

���<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� � ����<br />

��<br />

�<br />

�£<br />

� § �<br />

�<br />

� �<br />

�<br />

¤<br />

¤ ¥<br />

§£ �<br />

�� �<br />

�<br />

���<br />

��<br />

�<br />

Given a frame containing multiple<br />

panes, each with multiple<br />

but<strong>to</strong>ns/labels/checkboxes…<br />

- Call paint() method on frame<br />

causes everything <strong>to</strong> be painted.<br />

©§<br />

� �<br />

��<br />

- Changing the look and feel on the<br />

frame is likewise propagated down.<br />


• C o m p o n e n t<br />

• L e a f<br />

¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

�<br />

�<br />

�<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

�<br />

��<br />

�<br />

• C o m p o s i t e<br />

�<br />

�<br />

��<br />

�<br />

Participants<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

• C l i e n t<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

©��<br />

�<br />

�<br />

� � ��<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

� � ��<br />

��<br />

� � ��<br />

�<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

� � ��<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

����<br />

§ � �<br />

�<br />

��<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

�<br />

�<br />

�<br />

�<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�� �<br />

��<br />

� ��<br />

� ©§<br />

���<br />

��<br />

�� �<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

��<br />

��<br />

�<br />

��<br />

� ��<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

� � �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

� � �<br />

�<br />

�<br />

�<br />

��<br />

� � �<br />

�<br />

�<br />

�<br />

�<br />

¡


¢£<br />

¤<br />

¤<br />

¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

§ �<br />

�£<br />

¤<br />

¤<br />

¥<br />

§£ �<br />

�<br />

�<br />

���<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Structure<br />

Leaf<br />

operation()<br />

Client<br />

Component<br />

operation()<br />

addComponent()<br />

removeComponent()<br />

getChild()<br />

Composite<br />

operation()<br />

addComponent()<br />

removeComponent()<br />

getChild()<br />

0..*<br />

0..*<br />

+children


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

Collaborations<br />

• C o l l a b o r a t i o n s<br />

– C l i e n t u s e s c o m p o n e n t c l a s s i n t e r f a c e t o i n t e r a c t<br />

w i t h o b j e c t s i n c o m p o s i t e s t r u c t u r e .<br />

– I f r e c i p i e n t i s :<br />

¤�<br />

§<br />

©��<br />

¡<br />

¡<br />

�<br />

¢¤£<br />

¥<br />

¦ §<br />

��<br />

���<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

£<br />

©�<br />

£<br />

¨<br />

�<br />

�<br />

¨ £<br />

§ ��£<br />

�<br />

� ¥ �<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

©�<br />

£<br />

�<br />

����<br />

§ � �<br />

�<br />

£ � �<br />

¨�<br />

� ¦<br />

�<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

��<br />

�<br />

£<br />

¨<br />

¥¨<br />

� £<br />

�<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� ¨<br />

£<br />


¡¢<br />

£<br />

£<br />

¤<br />

¥¦<br />

§¤<br />

¨©<br />

£�<br />

¦<br />

¨�� �<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

���<br />

�<br />

¦ �<br />

�¢<br />

£<br />

£<br />

¤<br />

¦¢ �<br />

�<br />

�<br />

���<br />

�<br />

¨¦<br />

�<br />

�<br />

�<br />

�<br />

Consequences<br />

¡<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

���<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

����<br />

�<br />

�<br />

���<br />

�<br />

��<br />

��<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

���<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

��<br />

��<br />

��<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

��<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

����<br />

�<br />

���<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

��<br />

��<br />

���<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

���<br />

��<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

���<br />

��<br />

�<br />

�<br />

��<br />

��<br />

���<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

��<br />

�<br />

���<br />

��<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

��<br />

���<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

���<br />

�<br />

��<br />

��<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

����


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

Question?<br />

• W h y i s C o m p o s i t e c o n s i d e r e d a d e s i g n p a t t e r n a n d<br />

n o t j u s t a n e x a m p l e o f p o l y m o r p h i s m ?<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

� �<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� � �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

©��<br />

�<br />

��<br />

���<br />

�<br />

� �<br />

�<br />

�<br />

���<br />

�<br />

� �<br />

� �<br />

��<br />

� �<br />

� ��<br />

����<br />

�<br />

��<br />

�<br />

��<br />

��<br />

�<br />

� �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� ��<br />

��<br />

� �<br />

��<br />

��<br />

��<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

�� �<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�� �<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

� ���<br />

� �<br />

� � �<br />

� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

����<br />

§ � �<br />

�<br />

� � �<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

� � �<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

� �� � �<br />

� �<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

� ��<br />

��<br />

� � �<br />

�<br />

� ©§<br />

���<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

� �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

���<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

� �<br />

��<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

� �<br />

��<br />

��<br />

�<br />

�� �<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

� ��� �<br />

�<br />

� �<br />

�<br />

� �<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

¡<br />


¡<br />

¡<br />

First element<br />

¤<br />

¢£<br />

¤ ¥<br />

�<br />

¤��<br />

�<br />

�<br />

¢ �<br />

�<br />

�<br />

¦§<br />

¨¥<br />

©�<br />

��<br />

� �<br />

The Itera<strong>to</strong>r Pattern<br />

[Gamma et al, pp 257-271]<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� ���<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

� ��<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

£<br />

� � �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

����<br />

§ � �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

Last element<br />

for (int i=0; i < v.size(); i++) {<br />

…<br />

Object o = v.elementAt(i);<br />

…<br />

}<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

� ©§<br />

���<br />

��<br />

�<br />

� �<br />

� ��<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� � �<br />

�<br />

�<br />

�<br />

¥<br />

�<br />

�<br />

�<br />

Move <strong>to</strong> next<br />

element in list<br />

Current element<br />

�<br />

� �<br />

� �<br />

��<br />

�<br />

�<br />


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

The Itera<strong>to</strong>r Pattern<br />

• I t e r a t i o n a l l o w s a p r o g r a m t o s u c c e s s i v e l y<br />

v i s i t e a c h e l e m e n t i n a c o n t a i n e r c l a s s<br />

– I . e . o v e r a n y c l a s s t h a t c o n t a i n s a c o l l e c t i o n o f<br />

e l e m e n t s<br />

• L i s t ( V e c t o r ) , T r e e , H a s h T a b l e , G r a p h , …<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

����<br />

§ � �<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

¡


�<br />

�<br />

¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

�<br />

�<br />

�<br />

��<br />

���<br />

�<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

�<br />

Itera<strong>to</strong>rs in Java<br />

�<br />

�<br />

©��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

� �<br />

� �<br />

�<br />

��<br />

��<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

� � �<br />

�<br />

��<br />

public interface Enumeration {<br />

}<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

��<br />

���<br />

�<br />

�<br />

����<br />

§ � �<br />

��<br />

��<br />

�<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

�<br />

// Returns true as long as there are more<br />

// elements <strong>to</strong> visit<br />

boolean hasMoreElements();<br />

// Returns next element <strong>to</strong> visit<br />

Object nextElement();<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �� �<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�����<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

¡


�<br />

�<br />

¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

�<br />

���<br />

�<br />

���<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

Itera<strong>to</strong>rs in Java<br />

��<br />

����<br />

// Returns all elements in the Vec<strong>to</strong>r<br />

public Enumeration elements();<br />

���<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

¡ �<br />

��<br />

�<br />

// Returns all elements in the Hashtable.<br />

// That is, returns all values that have been<br />

// entered in<strong>to</strong> the hashtable via put<br />

public Enumeration elements();<br />

��<br />

��<br />

�<br />

�<br />

��<br />

����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥ §£<br />

��<br />

�<br />

� ©§<br />

���<br />

� �<br />

¡<br />

�<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Example: Using an Itera<strong>to</strong>r with<br />

a Vec<strong>to</strong>r<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

¡<br />

�¡<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� ¡<br />

�¡<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Using an Itera<strong>to</strong>r with a Vec<strong>to</strong>r<br />

• C l i e n t c r e a t e s a n i t e r a t o r<br />

b y c a l l i n g t h e V e c t o r ’ s<br />

elements m e t h o d<br />

¡<br />

�<br />

� �<br />

��<br />

¢¤£<br />

¥<br />

¦¨§<br />

¤�<br />

§<br />

©��<br />

��<br />

• C l i e n t t h e n a c c e s s e s<br />

©<br />

�¨�<br />

��<br />

e l e m e n t s o f V e c t o r v i a<br />

E n u m e r a t i o n ’ s m e t h o d s<br />

�<br />

��<br />

�<br />

�<br />

¡<br />

��<br />

���<br />

�¡<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�¨�<br />

�<br />

for (Enumeration e = v.elements(); e.hasMoreElements();) {<br />

Object o = e.nextElement();<br />

…<br />

}<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� ¡<br />

�¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Implementation of Itera<strong>to</strong>r for<br />

Vec<strong>to</strong>r<br />

• V e c t o r m u s t i m p l e m e n t m e t h o d<br />

– E n u m e r a t i o n e l e m e n t s ( )<br />

– M u s t r e t u r n a n i m p l e m e n t a t i o n o f t h e E n u m e r a t i o n<br />

i n t e r f a c e<br />

– I t e r a t o r m u s t s u c c e s s i v e l y r e t u r n v a l u e s i n v e c t o r<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Classes for Vec<strong>to</strong>r Itera<strong>to</strong>r<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

¡


class Vec<strong>to</strong>r {<br />

…<br />

public Enumeration elements ()<br />

{<br />

return new Vec<strong>to</strong>rEnumeration (this);<br />

}<br />

…<br />

}<br />

How we might implement an enumeration in a vec<strong>to</strong>r. (Not<br />

necessarily how it is really implemented.)


import java.util.Vec<strong>to</strong>r;<br />

class Vec<strong>to</strong>rEnumeration {<br />

// Represents where we are in the vec<strong>to</strong>r<br />

private int currentElement = 0;<br />

}<br />

// The vec<strong>to</strong>r we are iterating through<br />

private Vec<strong>to</strong>r v;<br />

public boolean hasMoreElements ()<br />

{<br />

return (currentElement < v.size());<br />

}<br />

public Object nextElement ()<br />

{<br />

Object returnElement = v.get (currentElement);<br />

currentElement++;<br />

return returnElement;<br />

}<br />

public Vec<strong>to</strong>rEnumeration (Vec<strong>to</strong>r v)<br />

{<br />

this.v = v;<br />

}


Abstract representation<br />

of container<br />

Concrete representation<br />

of container - e.g. Vec<strong>to</strong>r<br />

¤<br />

¢ £<br />

¤ ¥<br />

©�<br />

¨¥<br />

§ ¦<br />

General Form of Itera<strong>to</strong>r<br />

§ ©��<br />

¤�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

Concrete itera<strong>to</strong>r for specific container class - e.g.<br />

itera<strong>to</strong>r for Vec<strong>to</strong>r is different from itera<strong>to</strong>r for hashtable<br />

� � ����<br />

�£<br />

� § �<br />

¤ ¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Enumeration<br />

interface


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Relation <strong>to</strong> Quality Attributes<br />

• M o d i f i a b i l i t y<br />

– S e p a r a t e s i t e r a t i o n b e h a v i o u r f r o m s p e c i f i c s o f<br />

c o n t a i n e r c l a s s<br />

– T h e r e f o r e c a n c h a n g e c o n t a i n e r c l a s s w i t h o u t<br />

i m p a c t i n g c o d e t h a t i t e r a t e s o v e r i t<br />

• P e r f o r m a n c e<br />

– M a y b e s o m e m i n o r p e r f o r m a n c e p e n a l t y t h r o u g h<br />

i n d i r e c t i o n i n i t e r a t o r<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


• I n t e n t<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Builder Design Pattern<br />

[Gamma et. al. pp. 97-106]<br />

– S e p a r a t e t h e c o n s t r u c t i o n o f a c o m p l e x o b j e c t<br />

f r o m i t s r e p r e s e n t a t i o n<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Applicability<br />

• U s e t h e B u i l d e r p a t t e r n w h e n …<br />

– T h e a l g o r i t h m f o r c r e a t i n g a c o m p l e x o b j e c t<br />

s h o u l d b e i n d e p e n d e n t o f t h e p a r t s t h a t m a k e u p<br />

t h e o b j e c t a n d h o w t h e y ’ r e a s s e m b l e d<br />

– T h e c o n s t r u c t i o n p r o c e s s m u s t a l l o w d i f f e r e n t<br />

r e p r e s e n t a t i o n s f o r t h e o b j e c t t h a t ’ s c o n s t r u c t e d<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />


�<br />

¢ £<br />

¤<br />

¤<br />

¥<br />

¦ §<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

§ �<br />

�£<br />

¤<br />

¤<br />

¥<br />

§£ �<br />

�<br />

�<br />

���<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Participants<br />

¡£¢<br />

¤<br />

¥<br />

¦<br />

§¨<br />

©<br />

���<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�£�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

�£�<br />

�<br />

�<br />

¨<br />

§<br />

�<br />

§<br />

¡£¢<br />

¤<br />

¥<br />

¦<br />

§¨<br />

©<br />

� �<br />

�<br />

�<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

���<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

©<br />

�<br />

�<br />

����<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

©<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�£�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

¤ ¨<br />

§<br />

�<br />

� �<br />

¨<br />

©<br />

� �<br />

�<br />

�<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

���<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�£¨<br />

�<br />

¦<br />

¢<br />

�<br />

�<br />

©<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

� �<br />

���<br />

©<br />

� �<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

����<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

�<br />

� �<br />

��<br />

� ���<br />

���<br />

�<br />

� �<br />

����<br />

�<br />

���<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

�£�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

����<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

� �<br />

���<br />

� �<br />

�<br />

�<br />

�<br />

����<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

Example: JDOM SAXBuilder<br />

• C o n s t r u c t s p r o d u c t s f r o m a n X M L d o c u m e n t .<br />

�<br />

�<br />

�<br />

���<br />

���<br />

�<br />

�<br />

���<br />

� �<br />

��<br />

�<br />

���<br />

���<br />

� ��<br />

�<br />

�<br />

����<br />

�<br />

�<br />

�<br />

��<br />

��<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

����<br />

�<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

��<br />

�<br />

�� �<br />

�<br />

�<br />

� �<br />

�<br />

����<br />

����<br />

�£<br />

� § �<br />

�<br />

��<br />

����<br />

�<br />

�<br />

� �����<br />

�<br />

¤<br />

¤ ¥ §£<br />

��<br />

�<br />

��<br />

�<br />

�<br />

��<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

���<br />

���� �<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

�<br />

� ©§<br />

���<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

� �<br />

� �<br />

�<br />

� �<br />

���� �<br />

��<br />

���<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

�<br />

���<br />

�<br />

��<br />

�<br />

� ��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

��<br />

�<br />

��<br />

� �<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�� �<br />

�<br />

�<br />

��<br />

�<br />

�<br />

�<br />

����<br />

���<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

� �<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

� ���<br />

��<br />

�<br />

���<br />

�<br />

���<br />

��� �<br />

�<br />

�<br />

���<br />

�<br />

���<br />

� �<br />

��<br />

��<br />

�<br />

� ��<br />

�<br />

��<br />

�<br />

� �<br />

�<br />

�<br />

���<br />

��<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

���<br />

�� �<br />

�<br />

��<br />

��<br />

��<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

���<br />

�<br />

���<br />

�<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

���<br />

�<br />

����<br />

���<br />

��<br />

� �<br />

���<br />

�<br />

�<br />

� �<br />

�<br />

��<br />

�<br />

�<br />

�<br />

���<br />

�<br />

�<br />

�<br />

� � �<br />

��<br />

���<br />

�<br />

�<br />

���<br />

��<br />

�<br />

� �<br />

��<br />

��<br />

��<br />

��� �<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

��<br />

��<br />

����<br />

��<br />

�<br />

� ���<br />

� ���<br />

�<br />

�<br />

�<br />

�<br />

� �<br />

�<br />

�<br />

�<br />

�<br />

�<br />

� ���<br />

�<br />

�<br />

�<br />

� ��<br />

��<br />

�<br />

�<br />

�<br />

��<br />

�<br />

� � �<br />

��<br />

�<br />

�<br />

�<br />

���<br />

�<br />

��<br />

���� �<br />

�<br />

�<br />

�<br />

��<br />

�<br />

�<br />

��<br />

�<br />

¡


¡<br />

¢ £<br />

¤<br />

¤<br />

¥<br />

¦ §<br />

¨¥<br />

©�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

���<br />

�<br />

§ �<br />

�£<br />

¤<br />

¤<br />

¥<br />

§£ �<br />

�<br />

�<br />

���<br />

�<br />

©§<br />

�<br />

�<br />

�<br />

�<br />

Structure<br />

ConcreteBuilder<br />

buildPart()<br />

getProduct()<br />

Product<br />

Direc<strong>to</strong>r<br />

Builder<br />

buildPart()<br />


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Collaborations<br />

• The client creates the Direc<strong>to</strong>r object and<br />

conf ig u res it w ith the desired B u ilder object<br />

• Direc<strong>to</strong>r notif ies the B u ilder w henev er a p art<br />

of the p rodu ct shou ld be bu ilt<br />

• B u ilder handles req u ests f rom the direc<strong>to</strong>r<br />

and adds p arts <strong>to</strong> the p rodu ct<br />

• The client retriev es the p rodu ct f rom the<br />

bu ilder<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Collaborations (cont’d)<br />

aClient : Client aDirec<strong>to</strong>r :<br />

Direc<strong>to</strong>r<br />

¤�<br />

§<br />

©��<br />

�<br />

new ConcreteBuilder()<br />

new Direc<strong>to</strong>r(aConcreteBuilder)<br />

construct()<br />

getResult()<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

buildP artA()<br />

buildP artB()<br />

buildP artC()<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��<br />

aConcreteBuilder<br />

: ConcreteBuilder<br />

¡


• B enef its<br />

¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Consequences<br />

– I t l e t s y o u v a r y a p r o d u c t ’ s i n t e r n a l r e p r e s e n t a t i o n<br />

– I t i s o l a t e s c o d e f o r c o n s t r u c t i o n a n d<br />

r e p r e s e n t a t i o n<br />

– I t g i v e s y o u f i n e r c o n t r o l o v e r t h e c o n s t r u c t i o n<br />

p r o c e s s ( o b j e c t c o n s t r u c t e d s t e p -b y -s t e p u n d e r<br />

t h e d i r e c t o r ’ s c o n t r o l )<br />

• Disadv antag es<br />

– N / A<br />

¤�<br />

§<br />

©��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� � ����<br />

�£<br />

� § �<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

���<br />

��<br />

©§<br />

� �<br />

��


¤<br />

¢ £<br />

¤ ¥<br />

¦ §<br />

¨¥<br />

©�<br />

Relationship between Composite,<br />

Itera<strong>to</strong>r, and Builder<br />

• B u i l d e r , C o m p o s i t e a n d I t e r a t o r D e s i g n P a t t e r n s o f t e n<br />

w o r k t o g e t h e r<br />

�<br />

�<br />

¤�<br />

§<br />

©��<br />

¡<br />

¢¤£<br />

�<br />

��<br />

�<br />

¥<br />

�<br />

��<br />

��<br />

¢¦<br />

�<br />

¨§<br />

� ¦<br />

£ ¥ �<br />

�<br />

�<br />

¥<br />

¢¤©<br />

¥<br />

¦<br />

§<br />

¥ �<br />

���<br />

¦<br />

�<br />

§�<br />

��<br />

��<br />

�<br />

�<br />

��<br />

£<br />

� � ����<br />

£ �<br />

�<br />

���<br />

¦<br />

�£<br />

� § �<br />

¥<br />

¢¤£<br />

��<br />

¤<br />

¤ ¥<br />

§£ �<br />

�<br />

� ©<br />

£ �¥<br />

¦<br />

�<br />

�<br />

���<br />

��<br />

�<br />

�¥ £<br />

¥<br />

��<br />

©§<br />

� �<br />

��<br />

§<br />

¥<br />

©<br />

¥ � ©<br />

�<br />

�<br />

�<br />

£<br />

�<br />

��<br />

�<br />

£ �<br />

�<br />

¦<br />

¥ £<br />

�<br />

¥<br />

¢¤£<br />

¦<br />

�<br />

�<br />

��<br />

¢¦<br />

£<br />

�<br />

§


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

Summary of Patterns<br />

Discussed…<br />

• C r e a t i o n a l P a t t e r n s :<br />

�<br />

�<br />

���<br />

¦<br />

�<br />

¤�<br />

§<br />

©��<br />

�<br />

��<br />

¥ � ©<br />

�<br />

�<br />

£<br />

• S t r u c t u r a l P a t t e r n s :<br />

�<br />

�<br />

�<br />

�<br />

� £<br />

� �� © � �©<br />

�<br />

�<br />

�<br />

©<br />

�<br />

�<br />

¥ £<br />

��<br />

�<br />

£<br />

¦ ¨<br />

• B e h a v i o u r a l P a t t e r n s :<br />

�<br />

�<br />

� ©<br />

£ �¥<br />

�<br />

�<br />

£ �<br />

¥<br />

�<br />

��<br />

��<br />

�<br />

�<br />

�<br />

��<br />

£<br />

�<br />

�<br />

�<br />

¦<br />

¥ £<br />

�<br />

¥<br />

� ©<br />

¢¥<br />

�<br />

�<br />

�<br />

�<br />

¥<br />

� ��<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

����<br />

§ � �<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

¡<br />

¡


¤<br />

¢£<br />

¤ ¥<br />

¦§<br />

¨¥<br />

©�<br />

Final Points<br />

• D e s i g n P a t t e r n s e n c a p s u l a t e g e n e r i c s o l u t i o n s t o<br />

c o m m o n l y o c c u r r i n g p r o b l e m s i n d e s i g n<br />

�<br />

¤�<br />

§<br />

©��<br />

¦<br />

�<br />

¥<br />

¥ £<br />

§<br />

�<br />

�<br />

��<br />

��<br />

�<br />

�<br />

� �£¡<br />

�<br />

�<br />

�<br />

£<br />

��<br />

��<br />

�<br />

�<br />

� �<br />

�<br />

¦ £<br />

§<br />

�<br />

£<br />

����<br />

§ � �<br />

¦<br />

• T h e G a n g o f F o u r t e x t w a s t h e f i r s t w i d e l y r e a d w o r k<br />

o n p a t t e r n s , a n d r e m a i n s a w i d e l y c i t e d a n d u s e d<br />

r e f e r e n c e<br />

• P a t t e r n s r a r e l y e x i s t o n t h e i r o w n , t h e y o f t e n w o r k<br />

t o g e t h e r t o s o l v e c o m p l e x p r o b l e m s<br />

• T h e r e a r e a l w a y s c o s t s a n d b e n e f i t s t o a p p l y i n g a<br />

g i v e n p a t t e r n , w h i c h m u s t b e c a r e f u l l y w e i g h e d .<br />

¤<br />

�£<br />

¤ ¥<br />

§£ �<br />

§<br />

��<br />

�¤£<br />

� ¦ �¥<br />

� ©§<br />

���<br />

��<br />

�<br />

�<br />

�<br />

�<br />

�<br />

�<br />

§ £¡ ¥<br />

¥<br />

�<br />

¡

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!