CISC 323 Intro to Software Engineering
CISC 323 Intro to Software Engineering
CISC 323 Intro to Software Engineering
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 />
¡