Tải bản đầy đủ (.pdf) (681 trang)

Head first design patterns freeman 1e

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (26.72 MB, 681 trang )


Download at WoweBook.Com


Praise for Head First Design Patterns
“I received the book yesterday and started to read it on the way home... and I couldn’t stop. I took it to the
gym and I expect people saw me smiling a lot while I was exercising and reading. This is tres ‘cool’. It is
fun but they cover a lot of ground and they are right to the point. I’m really impressed.”
— Erich Gamma, IBM Distinguished Engineer,
and co-author of Design Patterns
“‘Head First Design Patterns’ manages to mix fun, belly-laughs, insight, technical depth and great practical
advice in one entertaining and thought provoking read. Whether you are new to design patterns, or have
been using them for years, you are sure to get something from visiting Objectville.”
— Richard Helm, coauthor of “Design Patterns” with rest of the
Gang of Four - Erich Gamma, Ralph Johnson and John Vlissides
“I feel like a thousand pounds of books have just been lifted off of my head.”
— Ward Cunningham, inventor of the Wiki
and founder of the Hillside Group
“This book is close to perfect, because of the way it combines expertise and readability. It speaks with
authority and it reads beautifully. It’s one of the very few software books I’ve ever read that strikes me as
indispensable. (I’d put maybe 10 books in this category, at the outside.)”
— David Gelernter, Professor of Computer Science,
Yale University and author of “Mirror Worlds” and “Machine Beauty”
“A Nose Dive into the realm of patterns, a land where complex things become simple, but where simple
things can also become complex. I can think of no better tour guides than the Freemans.”
— Miko Matsumura, Industry Analyst, The Middleware Company
Former Chief Java Evangelist, Sun Microsystems
“I laughed, I cried, it moved me.”
— Daniel Steinberg, Editor-in-Chief, java.net
“My first reaction was to roll on the floor laughing. After I picked myself up, I realized that not only is the
book technically accurate, it is the easiest to understand introduction to design patterns that I have seen.”


— Dr. Timothy A. Budd, Associate Professor of Computer Science at
Oregon State University and author of more than a dozen books,
including “C++ for Java Programmers”
“Jerry Rice runs patterns better than any receiver in the NFL, but the Freemans have out run him.
Seriously...this is one of the funniest and smartest books on software design I’ve ever read.”
— Aaron LaBerge, VP Technology, ESPN.com

Download at WoweBook.Com


More Praise for Head First Design Patterns
“Great code design is, first and foremost, great information design. A code designer is teaching a computer how to do something, and it is no surprise that a great teacher of computers should turn out to be
a great teacher of programmers. This book’s admirable clarity, humor and substantial doses of clever
make it the sort of book that helps even non-programmers think well about problem-solving.”
— Cory Doctorow, co-editor of Boing Boing
and author of “Down and Out in the Magic Kingdom”
and “Someone Comes to Town, Someone Leaves Town”
“There’s an old saying in the computer and videogame business – well, it can’t be that old because the
discipline is not all that old – and it goes something like this: Design is Life. What’s particularly curious
about this phrase is that even today almost no one who works at the craft of creating electronic games
can agree on what it means to “design” a game. Is the designer a software engineer? An art director?
A storyteller? An architect or a builder? A pitch person or a visionary? Can an individual indeed be in
part all of these? And most importantly, who the %$!#&* cares?
It has been said that the “designed by” credit in interactive entertainment is akin to the “directed by”
credit in filmmaking, which in fact allows it to share DNA with perhaps the single most controversial,
overstated, and too often entirely lacking in humility credit grab ever propagated on commercial art.
Good company, eh? Yet if Design is Life, then perhaps it is time we spent some quality cycles thinking
about what it is.
Eric and Elisabeth Freeman have intrepidly volunteered to look behind the code curtain for us in
“Head First Design Patterns.” I’m not sure either of them cares all that much about the PlayStation

or X-Box, nor should they. Yet they do address the notion of design at a significantly honest level such
that anyone looking for ego reinforcement of his or her own brilliant auteurship is best advised not to
go digging here where truth is stunningly revealed. Sophists and circus barkers need not apply. Next
generation literati please come equipped with a pencil.”
— Ken Goldstein, Executive Vice President & Managing Director,
Disney Online
“Just the right tone for the geeked-out, casual-cool guru coder in all of us. The right reference for
practical development strategies—gets my brain going without having to slog through a bunch of tired,
stale professor-speak.”
— Travis Kalanick, Founder of Scour and Red Swoosh
Member of the MIT TR100
“This book combines good humors, great examples, and in-depth knowledge of Design Patterns in
such a way that makes learning fun. Being in the entertainment technology industry, I am intrigued
by the Hollywood Principle and the home theater Facade Pattern, to name a few. The understanding
of Design Patterns not only helps us create reusable and maintainable quality software, but also helps
sharpen our problem-solving skills across all problem domains. This book is a must read for all computer professionals and students.”
— Newton Lee, Founder and Editor-in-Chief, Association for Computing
Machinery’s (ACM) Computers in Entertainment (acmcie.org)

Download at WoweBook.Com


More Praise for Head First Design Patterns
“If there’s one subject that needs to be taught better, needs to be more fun to learn, it’s design patterns.
Thank goodness for Head First Design Patterns.
From the awesome Head First Java folks, this book uses every conceivable trick to help you understand
and remember. Not just loads of pictures: pictures of humans, which tend to interest other humans.
Surprises everywhere. Stories, because humans love narrative. (Stories about things like pizza and
chocolate. Need we say more?) Plus, it’s darned funny.
It also covers an enormous swath of concepts and techniques, including nearly all the patterns you’ll

use most (observer, decorator, factory, singleton, command, adapter, façade, template method, iterator,
composite, state, proxy). Read it, and those won’t be ‘just words’: they’ll be memories that tickle you,
and tools you own.”
— Bill Camarda, READ ONLY
“After using Head First Java to teach our freshman how to start programming, I was eagerly waiting to
see the next book in the series. Head First Design Patterns is that book and I am delighted. I am sure
it will quickly become the standard first design patterns book to read, and is already the book I am
recommending to students.”
— Ben Bederson, Associate Professor of Computer Science & Director of the
Human-Computer Interaction Lab, University of Maryland
“Usually when reading through a book or article on design patterns I’d have to occasionally stick myself in
the eye with something just to make sure I was paying attention. Not with this book. Odd as it may sound,
this book makes learning about design patterns fun.
While other books on design patterns are saying, ‘Buehler... Buehler... Buehler...’ this book is on the float
belting out ‘Shake it up, baby!’”
— Eric Wuehler
“I literally love this book. In fact, I kissed this book in front of my wife.”
— Satish Kumar

Praise for the Head First approach
“Java technology is everywhere—in mobile phones, cars, cameras, printers, games, PDAs, ATMs, smart
cards, gas pumps, sports stadiums, medical devices, Web cams, servers, you name it. If you develop
software and haven’t learned Java, it’s definitely time to dive in—Head First.”
— Scott McNealy, Sun Microsystems Chairman, President and CEO
“It’s fast, irreverent, fun, and engaging. Be careful—you might actually learn something!”
— Ken Arnold, former Senior Engineer at Sun Microsystems
Co-author (with James Gosling, creator of Java),
“The Java Programming Language”
Download at WoweBook.Com



Other related books from O’Reilly
Learning Java
Java in a Nutshell
Java Enterprise in a Nutshell
Java Examples in a Nutshell
Java Cookbook
J2EE Design Patterns

Other books in O'Reilly's Head First series
Head First Java
Head First EJB
Head First Servlets & JSP
Head First Object-Oriented Analysis & Design
Head First HTML with CSS & XHTML
Head Rush Ajax
Head First PMP
Head First SQL (2007)
Head First C# (2007)
Head First Software Development (2007)
Head First JavaScript (2007)

Be watching for more books in the Head First series!

Download at WoweBook.Com


Head First Design Patterns
Wouldn’t it be dreamy if
there was a Design Patterns

book that was more fun than going
to the dentist, and more revealing
than an IRS form? It’s probably
just a fantasy...

Eric Freeman
Elisabeth Freeman
with
Kathy Sierra
Bert Bates

Beijing • Cambridge • Köln • Paris • Sebastopol • Taipei • Tokyo

Download at WoweBook.Com


+HDG)LUVW'HVLJQ3DWWHUQV
Ja-ZQK.ZMMUIV-TQ[IJM\P.ZMMUIV3I\Pa;QMZZIIVL*MZ\*I\M[
+WXaZQOP\7¼:MQTTa5MLQI1VK)TTZQOP\[ZM[MZ^ML
8ZQV\MLQV\PM=VQ\ML;\I\M[WN )UMZQKI
8]JTQ[PMLJa7¼:MQTTa5MLQI1VK/ZI^MV[\MQV0QOP_Ia6WZ\P;MJI[\WXWT+)!
7¼:MQTTa5MLQIJWWS[UIaJMX]ZKPI[MLNWZML]KI\QWVITJ][QVM[[WZ[ITM[XZWUW\QWVIT][M7VTQVMMLQ\QWV[IZM
IT[WI^IQTIJTMNWZUW[\\Q\TM[[INIZQWZMQTTaKWU.WZUWZMQVNWZUI\QWVKWV\IK\W]ZKWZXWZI\MQV[\Q\]\QWVIT[ITM[
LMXIZ\UMV\" !! !! WZKWZXWZI\M(WZMQTTaKWU

(GLWRU

5QSM4W]SQLM[

&RYHU'HVLJQHU


-TTQM>WTKSPI][MV

3DWWHUQ:UDQJOHUV

-ZQK.ZMMUIV-TQ[IJM\P.ZMMUIV

)DFDGH'HFRUDWLRQ

-TQ[IJM\P.ZMMUIV

6WUDWHJ\

3I\Pa;QMZZIIVL*MZ\*I\M[

2EVHUYHU

7TQ^MZ

3ULQWLQJ+LVWRU\
7K\WJMZ".QZ[\-LQ\QWV
IZM\ZILMUIZS[WZZMOQ[\MZML\ZILMUIZS[WN ;]V5QKZW[a[\MU[1VKQV\PM=VQ\ML;\I\M[IVLW\PMZKW]V\ZQM[
7¼:MQTTa5MLQI1VKQ[QVLMXMVLMV\WN ;]V5QKZW[a[\MU[
5IVaWN \PMLM[QOVI\QWV[][MLJaUIV]NIK\]ZMZ[IVL[MTTMZ[\WLQ[\QVO]Q[P\PMQZXZWL]K\[IZMKTIQUMLI[
\ZILMUIZS[
?PMZM\PW[MLM[QOVI\QWV[IXXMIZQV\PQ[JWWSIVL7¼:MQTTa5MLQI1VK_I[I_IZMWN I\ZILMUIZSKTIQU\PM
LM[QOVI\QWV[PI^MJMMVXZQV\MLQVKIX[WZQVQ\QITKIX[
?PQTMM^MZaXZMKI]\QWVPI[JMMV\ISMVQV\PMXZMXIZI\QWVWN \PQ[JWWS\PMX]JTQ[PMZIVL\PMI]\PWZ[I[[]UMVW
ZM[XWV[QJQTQ\aNWZMZZWZ[WZWUQ[[QWV[WZNWZLIUIOM[ZM[]T\QVONZWU\PM][MWN \PMQVNWZUI\QWVKWV\IQVMLPMZMQV

1VW\PMZ_WZL[QN aW]][MIVa\PQVOQV0MIL.QZ[\,M[QOV8I\\MZV[\W[IaZ]VIV]KTMIZXW_MZXTIV\aW]¼ZMWVaW]Z
W_V?MLWPW_M^MZMVKW]ZIOMaW]\W][M\PM,2>QM_IXX
6WL]KS[_MZMPIZUMLQV\PMUISQVOWN \PQ[JWWS

ISBN-10: 0-596-00712-4

ISBN-13: 978-0-596-00712-6

[M]

[7/07]

Download at WoweBook.Com


To the Gang of Four, whose insight and expertise in capturing
and communicating Design Patterns has changed the face of
software design forever, and bettered the lives of developers
throughout the world.

But seriously, when are we going to see a second edition? After all,
it’s been only ten years!

Download at WoweBook.Com


WKHDXWKRUV

)]\PWZ[,M^MTWXMZ[WN0MIL.QZ[\,M[QOV8I\\MZV[

)UHHPDQ

K
(OLVDEHW

(ULF)UHHPDQ

-TQ[IJM\PQ[IVI]\PWZ[WN\_IZMLM^MTWXMZIVL
LQOQ\ITIZ\Q[\;PM¼[JMMVQV^WT^ML_Q\P\PM1V\MZVM\
[QVKM\PMMIZTaLIa[PI^QVOKWNW]VLML8ZWRMK\<)8IVI_IZL_QVVQVO_MJ[Q\MNWZ_WUMV
QVKWUX]\QVOVW_ILWX\MLJa\PM)+55WZM
ZMKMV\Ta-TQ[IJM\PTMILZM[MIZKPIVLLM^MTWXUMV\
MNNWZ\[QVLQOQ\ITUMLQII\\PM?IT\,Q[VMa+WUXIVa
_PMZM[PMKWQV^MV\ML5W\QWVIKWV\MV\[a[\MU\PI\
LMTQ^MZ[\MZIJa\M[WN ^QLMWM^MZaLIa\W,Q[VMa-;86
IVL5W^QM[KWU][MZ[
-TQ[IJM\PQ[IKWUX]\MZ[KQMV\Q[\I\PMIZ\IVLPWTL[
OZIL]I\MLMOZMM[QV+WUX]\MZ;KQMVKMNZWUAITM
=VQ^MZ[Q\aIVL1VLQIVI=VQ^MZ[Q\a;PM¼[_WZSMLQV
I^IZQM\aWN IZMI[QVKT]LQVO^Q[]ITTIVO]IOM[:;;
[aVLQKI\QWVIVL1V\MZVM\[a[\MU[;PM¼[IT[WJMMVIV
IK\Q^MIL^WKI\MNWZ_WUMVQVKWUX]\QVOLM^MTWXQVO
XZWOZIU[\PI\MVKW]ZIOM_WUIV\WMV\MZ\PMÅMTL
WVPMZ5IKIT\PW]OP[PMLZMIU[WN ILIa_PMV\PM
_PWTM_WZTLQ[][QVO;KPMUM
-TQ[IJM\PPI[TW^MLPQSQVOIVL\PMW]\LWWZ[[QVKMPMZ
LIa[OZW_QVO]XQV;KW\TIVL?PMV[PM¼[W]\LWWZ[
PMZKIUMZIQ[VM^MZNIZ;PM¼[IT[WIVI^QLKaKTQ[\

^MOM\IZQIVIVLIVQUITTW^MZ
AW]KIV[MVLPMZMUIQTI\JM\P(_QKSMLTa[UIZ\KWU

-ZQKQ[IKWUX]\MZ[KQMV\Q[\_Q\PIXI[[QWVNWZUMLQIIVL
[WN\_IZMIZKPQ\MK\]ZM[0MR][\_ZIXXML]XNW]ZaMIZ[I\
ILZMIURWJ·LQZMK\QVO1V\MZVM\JZWILJIVLIVL_QZMTM[[
MNNWZ\[I\,Q[VMa·IVLQ[VW_JIKS\W_ZQ\QVOKZMI\QVOKWWT
[WN\_IZMIVLPIKSQVO2I^IIVL5IK[
-ZQK[XMV\ITW\WN \PM»![_WZSQVOWVIT\MZVI\Q^M[\W\PM
LM[S\WXUM\IXPWZ_Q\P,I^QL/MTMZV\MZIVL\PMa¼ZM
JW\P[\QTTI[SQVO\PMY]M[\QWV¹_PaLW1PI^M\WOQ^MIÅTM
IVIUM'º*I[MLWV\PQ[_WZS-ZQKTIVLMLI8P,I\
AITM=VQ^MZ[Q\aQV»!0MIT[WKWNW]VLML5QZZWZ?WZTL[
^MZ[QWVWN PQ[\PM[Q[_WZS4QNM[\ZMIU[
1VIXZM^QW][TQNM-ZQKJ]QT\[WN\_IZMNWZVM\_WZS[IVL
[]XMZKWUX]\MZ[AW]UQOP\SVW_PQUNZWU[]KPJWWS[I[
2I^I;XIKM[8ZQVKQXTM[8I\\MZV[IVL8ZIK\QKM-ZQKPI[NWVL
UMUWZQM[WN QUXTMUMV\QVO\]XTM[XIKM[a[\MU[WV
1V\MZVM\QVNWZUI\QWV[a[\MU[NWZ6);)QV\PMTI\M [
-ZQKQ[K]ZZMV\TaTQ^QVOQV\PMPQOPLM[MZ\VMIZ;IV\I
.M?PMVPM¼[VW\_ZQ\QVO\M`\WZKWLMaW]¼TTÅVLPQU
[XMVLQVOUWZM\QUM\_MISQVO\PIV_I\KPQVOPQ[PWUM
\PMI\MZIVL\ZaQVO\WZM[\WZQVOIKQZKI! [,ZIOWV¼[4IQZ
^QLMWOIUM0MIT[W_W]TLV¼\UQVLUWWVTQOP\QVOI[IV
MTMK\ZWVQKI,2
?ZQ\M\WPQUI\MZQK(_QKSMLTa[UIZ\KWUWZ^Q[Q\PQ[JTWO
I\P\\X"___MZQKNZMMUIVKWU


YLLL
Download at WoweBook.Com


Creators of the Head First series
(and co-conspirators on this book)
Kathy Sierra

Bert Bates

Bert is a long-time software developer and architect,

Kathy has been interested in learning theory since

her days as a game designer (she wrote games for Virgin,
MGM, and Amblin’). She developed much of the Head
First format while teaching New Media Authoring for
UCLA Extension’s Entertainment Studies program.
More recently, she’s been a master trainer for Sun
Microsystems, teaching Sun’s Java instructors how to
teach the latest Java technologies, and developing several
of Sun’s certification exams. Together with Bert Bates,
she has been actively using the Head First concepts to
teach throusands of developers. Kathy is the founder of
javaranch.com, which won a 2003 and 2004 Software
Development magazine Jolt Cola Productivity Award.
You might catch her teaching Java on the Java Jam Geek
Cruise (geekcruises.com).
She recently moved from California to Colorado, where
she’s had to learn new words like, “ice scraper” and

“fleece”, but the lightning there is fantastic.

but a decade-long stint in artificial intelligence drove
his interest in learning theory and technology-based
training. He’s been helping clients becoming better
programmers ever since. Recently, he’s been heading
up the development team for several of Sun’s Java
Certification exams.

He spent the first decade of his software career
travelling the world to help broadcast clients like
Radio New Zealand, the Weather Channel, and the
Arts & Entertainment Network (A & E). One of his
all-time favorite projects was building a full rail system
simulation for Union Pacific Railroad.
Bert is a long-time, hopelessly addicted go player, and
has been working on a go program for way too long.
He’s a fair guitar player and is now trying his hand at
banjo.
Look for him on javaranch, on the IGS go server, or
you can write to him at

Likes: runing, skiing, skateboarding, playing with her
Icelandic horse, and weird science. Dislikes: entropy.
You can find her on javaranch, or occasionally blogging
on java.net. Write to her at

Download at WoweBook.Com



table of contents

Table of Contents (summary)
Intro

xxv

1

Welcome to Design Patterns: an introduction

1

2

Keeping your Objects in the know: the Observer Pattern

37

3

Decorating Objects: the Decorator Pattern

79

4

Baking with OO goodness: the Factory Pattern

109


5

One of a Kind Objects: the Singleton Pattern

169

6

Encapsulating Invocation: the Command Pattern

191

7

Being Adaptive: the Adapter and Facade Patterns

235

8

Encapsulating Algorithms: theTemplate Method Pattern

275

9

Well-managed Collections: the Iterator and Composite Patterns

315


10

The State of Things: the State Pattern

385

11

Controlling Object Access: the Proxy Pattern

429

12

Patterns of Patterns: Compound Patterns

499

13

Patterns in the Real World: Better Living with Patterns

577

14

Appendix: Leftover Patterns

611


Table of Contents (the real thing)
Intro
Your brain on Design Patterns.

Here you are trying to learn something, while

here your brain is doing you a favor by making sure the learning doesn’t stick. Your brain’s
thinking, “Better leave room for more important things, like which wild animals to avoid and
whether naked snowboarding is a bad idea.” So how do you trick your brain into thinking
that your life depends on knowing Design Patterns?
Who is this book for?

xxvi

We know what your brain is thinking

xxvii

Metacognition

xxix

Bend your brain into submission

xxxi

Technical reviewers

xxxiv


Acknowledgements

xxxv

x
Download at WoweBook.Com


1

intro to Design Patterns
Welcome to Design Patterns
Someone has already solved your problems. In this chapter,
you’ll learn why (and how) you can exploit the wisdom and lessons learned by
other developers who’ve been down the same design problem road and survived
the trip. Before we’re done, we’ll look at the use and benefits of design patterns,
look at some key OO design principles, and walk through an example of how one
pattern works. The best way to use patterns is to load your brain with them and
then recognize places in your designs and existing applications where you can
apply them. Instead of code reuse, with patterns you get experience reuse.

Remember, knowing
concepts like abstraction,
inheritance, and polymorphism do
not make you a good object oriented
designer. A design guru thinks
about how to create flexible
designs that are maintainable
and that can cope with

change.

The SimUDuck app

2

Joe thinks about inheritance...

5

How about an interface?

6

The one constant in software development

8

Separating what changes from what stays the same

10

Designing the Duck Behaviors

11

Testing the Duck code

18


Setting behavior dynamically

20

The Big Picture on encapsulated behaviors

22

HAS-A can be better than IS-A

23

The Strategy Pattern

24

The power of a shared pattern vocabulary

28

How do I use Design Patterns?

29

Tools for your Design Toolbox

32

Exercise Solutions


34
AIN

r

avio
fly beh

ulated

Encaps

Your BR

e>>

<
vior

FlyBeha

fly()

y
FlyNoWa

ings
FlyWithW


fly() {
- can’t fly!
// do nothing

fly() {
ts duck flying
// implemen
ior flyBehav
havior;
havior quackBe

Client

}

}

ior;

FlyBehav

ulated

QuackBe

Encaps

swim()
display()


quack

r

behavio

e>>

<
ehavior

QuackB

uack()

performQ

quack()

ly()

performF

avior()
)
Behavior(
..
setQuack
methods.

duck-like
// OTHER

setFlyBeh

MuteQuack
Squeak
Quack
Decoy Duck

Rubber

Redhead

Object that
holds state

Duck

{
display()
}
a redhead
// looks like

quack) {
ts duck quacking
// implemen

{

display()
duck }
a decoy
// looks like

quack() {
duckie squeak
// rubber

}

}

}

OBSERVER

8

8

Su
bje

Duck

{
display()
ck }
a rubberdu

// looks like

int

ct Obje

ct
Dog Obje

8
8
8

Duck Obje

Mo

Automatic update/notification

ct

Cat Object

ec
use Obj

t

Observers


oller

Contr

t Objects

Duck

quack() {
- can’t quack!
// do nothing

Dependen

Mallard

{
display()
}
a mallard
// looks like

ct

A Bunch of Patterns

Duck

MVC
l


est
Requ

Mode

View

new
Your Code,ednowwith
and improv erns!
design patt

xi
Download at WoweBook.Com


table of contents

2

the Observer Pattern
Keeping your Objects in the Know
Don’t miss out when something interesting happens!
We’ve got a pattern that keeps your objects in the know when something they
might care about happens. Objects can even decide at runtime whether they
want to be kept informed. The Observer Pattern is one of the most heavily used
patterns in the JDK, and it’s incredibly useful. Before we’re done, we’ll also look
at one to many relationships and loose coupling (yeah, that’s right, we said
coupling). With Observer, you’ll be the life of the Patterns Party.


OO Basics
what varies
Encapsulate
herition over in
si
o
p
m
o
C
r
Favo
tance
not
Interfaces,
o
t
m
a
r
g
o
r
P
ions
implementat
led
loosely coup
Strive for ween objects that

designs bet
interact

39

Meet the Observer Pattern

44

Publishers + Subscribers = Observer Pattern

45

Five minute drama: a subject for observation

48

The Observer Pattern defined

51

The power of Loose Coupling

53

Designing the Weather Station

56

Implementing the Weather Station


57

Using Java’s built-in Observer Pattern

64

The dark side of java.util.Observable

71

Tools for your Design Toolbox

74

Exercise Solutions

78

ONE TO MANY RELATIONSHIP

Object that
holds state

8

8
int

ct Obje


ct

Su
bje

ct
Dog Obje

8
8
8

Duck Obje

Automatic update/notification

xii
Download at WoweBook.Com

Mo

ct

Cat Object

ec
use Obj

t


Observers

Dependent Objects

s

OO Principle

Abstraction
n
Encapsulatio
m
is
Polymorph
Inheritence

The Weather Monitoring application


3

the Decorator Pattern
Decorating Objects
Just call this chapter “Design Eye for the Inheritance
Guy.” We’ll re-examine the typical overuse of inheritance and you’ll learn how
to decorate your classes at runtime using a form of object composition. Why?
Once you know the techniques of decorating, you’ll be able to give your (or
someone else’s) objects new responsibilities without making any code changes
to the underlying classes.


I used to think real men
subclassed everything. That was until
I learned the power of extension
at runtime, rather than at compile
time. Now look at me !

Welcome to Starbuzz Coffee

80

The Open-Closed Principle

86

Meet the Decorator Pattern

88

Constructing a Drink Order with Decorators

89

The Decorator Pattern Defined

91

Decorating our Beverages

92


Writing the Starbuzz code

95

Real World Decorators: Java I/O

100

Writing your own Java I/O Decorator

102

Tools for your Design Toolbox

105

Exercise Solutions

106

xiii
Download at WoweBook.Com


table of contents

4

the Factory Pattern

Baking with OO Goodness
Get ready to cook some loosely coupled OO designs.
There is more to making objects than just using the new operator. You’ll learn
that instantiation is an activity that shouldn’t always be done in public and can
often lead to coupling problems. And you don’t want that, do you? Find out how
Factory Patterns can help save you from embarrasing dependencies.

The clients of the Abstract
Factory are the two
instances of our PizzaStore,
NYPizzaStore and
ChicagoStylePizzaSore.
NYPizzaStore
createPizza()

The abstract PizzaIngredientFactory
is the interface that defines how to
make a family of related products
- everything we need to make a pizza.

<<interface>>
Dough

ThickCrustDough

ThinCrustDough

<<interface>>
PizzaIngredientFactory


When you see “new”, think “concrete”

110

Objectville Pizza

112

Encapsulating object creation

114

Building a simple pizza factory

115

The Simple Factory defined

117

A Framework for the pizza store

120

Allowing the subclasses to decide

121

Let’s make a PizzaStore


123

Declaring a factory method

125

Meet the Factory Method Pattern

131

Parallel class hierarchies

132

Factory Method Pattern defined

134

A very dependent PizzaStore

137

Looking at object dependencies

138

The Dependency Inversion Principle

139


Meanwhile, back at the PizzaStore...

144

Families of ingredients...

145

Building our ingredient factories

146

Looking at the Abstract Factory

153

Behind the scenes

154

Abstract Factory Pattern defined

156

Factory Method and Abstract Factory compared

160

Tools for your Design Toolbox


162

Exercise Solutions

164

createDough()

<<interface>>
Sauce

createSauce()
createCheese()
createVeggies()
createPepperoni()

PlumTomatoSauce

createClam()

NYPizzaIngredientFactory

ChicagoPizzaIngredientFactory

createDough()

createDough()

createSauce()


createSauce()

createCheese()

createCheese()

createVeggies()

createVeggies()

createPepperoni()

createPepperoni()

createClam()

createClam()

MarinaraSauce

<<interface>>
Cheese

Mozzarella Cheese

ReggianoCheese

<<interface>>
Clams


The job of the concrete
pizza factories is to
make pizza ingredients.
Each factory knows
how to create the right
objects for their region.

FrozenClams

Each factory produces a different
implementation for the family of products.

FreshClams

xiv
Download at WoweBook.Com


5

the Singleton Pattern
One of a Kind Objects
The Singleton Pattern: your ticket to creating one-of-akind objects, for which there is only one instance. You
might be happy to know that of all patterns, the Singleton is the simplest in terms
of its class diagram; in fact the diagram holds just a single class! But don’t get
too comfortable; despite its simplicity from a class design perspective, we’ll
encounter quite a few bumps and potholes in its implementation. So buckle
up—this one’s not as simple as it seems...
One and only one object


170

The Little Singleton

171

Dissecting the classic Singleton Pattern

173

Confessions of a Singleton

174

The Chocolate Factory

175

Singleton Pattern defined

177

Houston, we have a problem...

178

BE the JVM

179


Dealing with multithreading

180

Singleton Q&A

184

Tools for your Design Toolbox

186

Exercise Solutions

188

Hershey, PA

OO Pattenersnasinfaesmilya onofe-algotori-thmmnaans,r-ly

ef ak
itiniote
dso
ad
th
vidi-ine eanan
actjeesohct
roat
seyrov-ereaderachfit-beoondrtw
mob

StrOatbeg
- Pth
Adntt
ysctdem
r
e,-an
rysof
eeF
ef
c
a
d-myn
it
th
es
c
ri
aliliDvalam
t
cy
e
at
go
c
je
o
e,
ul
en
al

a
D
es
h
ob
e
at
t
e
th
st
an
am
encadpsepenAdbstrra
but
s
f
M
ts
to
le
ge
y
ng
s
r
an
gy
ie
ti

ibed
o
ch
te
x
ea
t
lit
ob
le
c
bi
cr
f
ct
a
an
si
.
St
je
asitjeleshoctonut, lyg inha-s t
a
it
F
or
on
at
.
cl

ng
e
e
f
ob
d
le
sp
ustidurjeup
reabn inonteerface at
ectas wte
atea
pr
th
anns
ssed
chanwge
he
Eid
intoal poin
fnttioor
iecr
-dov
ieor
ob
f
s
e
nd
cl

n
t
as
ac
or
cl
en
om
no
t
ec
ob
rf
ex
e
fr
gl
le
D
ch
te
y
g
ar
or
ep
hi
a
in
.

tl
f
d
wovclidaseses. a class
tsSdinor sssuesbcladec
llyenreden
geprte
canden
ssnciniddre
te
indedpeep
laat
bcto
coan
stan
inlath
eirceac
leictifon
Method lets .
alivyisulyeeng
ry
atec
to
.
F
aualtotemsprn
it
e.
to
y.

at
lit
ss
ti
anof acce ation to the subclasses
iona
functst
ti
defer instan

xv
Download at WoweBook.Com


table of contents

6

the Command Pattern
Encapsulating Invocation
In this chapter we take encapsulation to a whole new
level: we’re going to encapsulate method invocation.
That’s right, by encapsulating invocation we can crystallize pieces of computation
so that the object invoking the computation doesn’t need to worry about how to do
things; it just uses our crystallized method to get it done. We can also do some
wickedly smart things with these encapsulated method invocations, like save
them away for logging or reuse them to implement undo in our code.

er
sists of an ord

The Order con
omer’s menu
slip and the custwritten on it.
are
t
tha
s
item
crea

eese
with Ch
Burger Shake
Malt

I’ll have a Burger
with Cheese and a Malt
Shake

teO

rde

r()

ere
rt H
Sta
takeO


rder(

The customer knows
what he wants and
creates an order.

)

The Waitress takes the Order,
gets around to it, she calls and when she
orderUp()
method to begin the Order’sitsprepar
ation.

or

de

rU

p(

)

The Short Order
Cook follows the
instructions of
the Order and
produces the meal.


se
with Chee
Burger Shake
Malt

makeBurger(), makeShake()

192

The Remote Control

193

Taking a look at the vendor classes

194

Meanwhile, back at the Diner...

197

Let’s study the Diner interaction

198

The Objectville Diner Roles and Responsibilities

199

From the Diner to the Command Pattern


201

Our first command object

203

The Command Pattern defined

206

The Command Pattern and the Remote Control

208

Implementing the Remote Control

210

Putting the Remote Control through its paces

212

Time to write that documentation

215

Using state to implement Undo

220


Every remote needs a Party Mode!

224

Using a Macro Command

225

More uses of the Command Pattern: Queuing requests

228

More uses of the Command Pattern: Logging requests

229

Tools for your Design Toolbox

230

Exercise Solutions

232

ou

tp

ut


s all
rder ha
The O structions e
the in to prepar
neededeal. The e
the m directs th k
Order Order Cooe
Short methods lik
with urger().
makeB

Home Automation or Bust

xvi
Download at WoweBook.Com


7

the Adapter and Facade Patterns
Being Adaptive
In this chapter we’re going to attempt such impossible
feats as putting a square peg in a round hole. Sound impossible?
Not when we have Design Patterns. Remember the Decorator Pattern? We
wrapped objects to give them new responsibilities. Now we’re going to wrap some
objects with a different purpose: to make their interfaces look like something they’re
not. Why would we do that? So we can adapt a design expecting one interface to a
class that implements a different interface. That’s not all, while we’re at it we’re going
to look at another pattern that wraps objects to simplify their interface.


European Wall Outlet

AC Power Adapter

Standard AC Plug

Adapters all around us

236

Object Oriented Adapters

237

The Adapter Pattern explained

241

Adapter Pattern defined

243

Object and Class Adapters

244

Tonight’s talk: The Object Adapter and Class Adapter

247


Real World Adapters

248

Adapting an Enumeration to an Iterator

249

Tonight’s talk: The Decorator Pattern and the Adapter Pattern

252

Home Sweet Home Theater

255

Lights, Camera, Facade!

258

Constructing your Home Theater Facade

261

Facade Pattern defined

264

The Principle of Least Knowledge


265

Tools for your Design Toolbox

270

Exercise Solutions

272

)

Adap tee

est(

qu
Re

reques

Client

t()

nted
The Client is impleme
against the target interface


ted
nsla

tra

Adap ter
adaptee
interface

e
rfac

te
t in
rge

ta

nts the
The Adapter impleme
an
target interface and holds
instance of the Adaptee

Turkey was the
ce
adaptee interfa

xvii
Download at WoweBook.Com



table of contents

the Template Method Pattern

8

Encapsulating Algorithms
We’ve encapsulated object creation, method invocation,
complex interfaces, ducks, pizzas... what could be next?
We’re going to get down to encapsulating pieces of algorithms so that subclasses can
hook themselves right into a computation anytime they want. We’re even going to
learn about a design principle inspired by Hollywood.

We’ve recognized
that the two recipes
are essentially the
same, although
some of the steps
require different
implementations. So
we’ve generalized the
recipe and placed it in
the base class.

Te a
Boil some wat

1

2

Ste ep

er

C o f fe e
1

the water
the tea bag in

3

Pou r tea in a

4

Add lemon

2
3

cup

4

Bo il some
Brew th
e

Po ur co ff

Add suga
r

wate r

co ffee gr

ee in a cu

inds

p

and mi lk

Caffeine Beverage
generalize

1
2

Brew

relies on

3

Pour beverage in a cup


4

Add condiments

subclass for

ss

Tea subcla

some steps

2

Steep the teabag in the

4

Add lemon

water

Boil some water

knows
Caffeine Beveragesteps of
and controls theperforms
the recipe, and f, but
itsel

3
steps 1 and
fee
relies on Tea orandCof4.
to do steps 2

Whipping up some coffee and tea classes

277

Abstracting Coffee and Tea

280

Taking the design further

281

Abstracting prepareRecipe()

282

What have we done?

285

Meet the Template Method

286


Let’s make some tea

287

What did the Template Method get us?

288

Template Method Pattern defined

289

Code up close

290

Hooked on Template Method...

292

Using the hook

293

Coffee? Tea? Nah, let’s run the TestDrive

294

The Hollywood Principle


296

The Hollywood Principle and the Template Method

297

Template Methods in the Wild

299

Sorting with Template Method

300

We’ve got some ducks to sort

301

Comparing ducks and ducks

302

The making of the sorting duck machine

304

Swingin’ with Frames

306


Applets

307

Tonight’s talk: Template Method and Strategy

308

Tools for your Design Toolbox

311

Exercise Solutions

312

generalize

relies on
subclass for
some steps

Coffee

subclass

fee gri nds

2


Bre w the cof

4

Add sug ar and

mil k

xviii
Download at WoweBook.Com


the Iterator and Composite Patterns

9

Well-Managed Collections
There are lots of ways to stuff objects into a collection.
Put them in an Array, a Stack, a List, a Map, take your pick. Each has its own
advantages and tradeoffs. But when your client wants to iterate over your objects,
are you going to show him your implementation? We certainly hope not! That just
wouldn’t be professional. Don’t worry—in this chapter you’ll see how you can let
your clients iterate through your objects without ever seeing how you store your
objects. You’re also going to learn how to create some super collections of objects
that can leap over some impressive data structures in a single bound. You’re also
going to learn a thing or two about object responsibility.

nu

All Menus

Pa

eM
e

nc
ake us
Ho

Di
ner nu
Me

1

Ca
feMenu

2

3

Café Menu

Pancake Menu

Diner Menu
Me
nuItem


Me
nuItem

1

2

Me
nuItem

Men

3

uItem

4

key

Array

1

key

Me
nuItem

key


Me
nuItem

Me
nuItem

2

Me
nuItem

Me
nuItem

ArrayList

Dessert Menu

key

3
Me
nuItem

4

1
Me
nuItem


2
Me
nuItem

3
Me
nuItem

4
Men

Men

uItem

Men

uItem

Objectville Diner and Pancake House merge

316

Comparing Menu implementations

318

Can we encapsulate the iteration?


323

Meet the Iterator Pattern

325

Adding an Iterator to DinerMenu

326

Looking at the design

331

Cleaning things up with java.util.Iterator

333

What does this get us?

335

Iterator Pattern defined

336

Single Responsibility

339


Iterators and Collections

348

Iterators and Collections in Java 5

349

Just when we thought it was safe...

353

The Composite Pattern defined

356

Designing Menus with Composite

359

Implementing the Composite Menu

362

Flashback to Iterator

368

The Null Iterator


372

The magic of Iterator & Composite together...

374

Tools for your Design Toolbox

380

Exercise Solutions

381

uItem

xix
Download at WoweBook.Com


table of contents

the State Pattern

10

The State of Things
A little known fact: the Strategy and State Patterns were
twins separated at birth. As you know, the Strategy Pattern went on
to create a wildly successful business around interchangeable algorithms. State,

however, took the perhaps more noble path of helping objects learn to control their
behavior by changing their internal state. He’s often overheard telling his object
clients, “just repeat after me, I’m good enough, I’m smart enough, and doggonit...”

Where the Gumball Machine
is Never Half Empty

gumbal

ls = 0

ball

s>

ns

cra

arter

inserts qu

No
r
Quarte
gum

tur


Has r
Quarte

arter

Out obfalls
Gum

0

ejects qu

Mighty Gumball, Inc.

controller needs to
the gumball machine
for us! We
Here’s the way we thinkcan
implement this in Java
work. We’re hoping you
e, so you need to keep
futur
the
in
ior
behav
more
g
may be addin
le!

possib
as
e
ainabl
maint
and
le
the design as flexib
- Mighty Gumball Engineers

dispenslle
gumba

ll
Gumba
Sold

nk

How do we implement state?

387

State Machines 101

388

A first attempt at a state machine

390


You knew it was coming... a change request!

394

The messy STATE of things...

396

Defining the State interfaces and classes

399

Implementing our State Classes

401

Reworking the Gumball Machine

402

The State Pattern defined

410

State versus Strategy

411

State sanity check


417

We almost forgot!

420

Tools for your Design Toolbox

423

Exercise Solutions

424

xx
Download at WoweBook.Com


11

the Proxy Pattern
Controlling Object Access
Ever play good cop, bad cop? You’re the good cop and you provide
all your services in a nice and friendly manner, but you don’t want everyone
asking you for services, so you have the bad cop control access to you. That’s
what proxies do: control and manage access. As you’re going to see there are
lots of ways in which proxies stand in for the objects they proxy. Proxies have
been known to haul entire method calls over the Internet for their proxied objects;
they’ve also been known to patiently stand in the place for some pretty lazy

objects.

Not
Hot

<<interface>>

Monitoring the gumball machines

430

The role of the ‘remote proxy’

434

RMI detour

437

GumballMachine remote proxy

450

Remote proxy behind the scenes

458

The Proxy Pattern defined

460


Get Ready for virtual proxy

462

Designing the CD cover virtual proxy

464

Virtual proxy behind the scenes

470

Using the Java API’s proxy

474

Five minute drama: protecting subjects

478

Creating a dynamic proxy

479

The Proxy Zoo

488

Tools for your Design Toolbox


491

Exercise Solutions

492

<<interface>>
InvocationHandler

Subject

request()

invoke()

now consists
The proxy sse
s.
cla
o
of tw
Proxy

RealSubject
request()

request()

InvocationHandler

invoke()

xxi
Download at WoweBook.Com


table of contents

12

Compound Patterns
Patterns of Patterns
Who would have ever guessed that Patterns could work
together? You’ve already witnessed the acrimonious Fireside Chats (and be
thankful you didn’t have to see the Pattern Death Match pages that the publisher
forced us to remove from the book so we could avoid having to use a Parent’s
Advisory warning label), so who would have thought patterns can actually get along
well together? Believe it or not, some of the most powerful OO designs use several
patterns together. Get ready to take your pattern skills to the next level; it’s time for
Compound Patterns. Just be careful—your co-workers might kill you if you’re struck
with Pattern Fever.

The beat is set at 119 BPM and you
would like to increase it to 120.

You click on
the increase
beat button.

View


Which results in the
controller being invoked.

Controller
You see the beatbar
pulse every 1/2 second.

Because the BPM is 120, the view
gets
a beat notification every 1/2 second.

View

The controller asks
the model to update
its BPM by one.

atMod
Be on() el
setBPM() off()
getBPM

The view is updated
to 120 BPM.

BPM
View is notified that theM()
on
changed. It calls getBP

the model state.

()

Compound Patterns

500

Duck reunion

501

Adding an adapter

504

Adding a decorator

506

Adding a factory

508

Adding a composite, and iterator

513

Adding an observer


516

Patterns summary

523

A duck’s eye view: the class diagram

524

Model-View-Controller, the song

526

Design Patterns are your key to the MVC

528

Looking at MVC through patterns-colored glasses

532

Using MVC to control the beat...

534

The Model

537


The View

539

The Controller

542

Exploring strategy

545

Adapting the model

546

Now we’re ready for a HeartController

547

MVC and the Web

549

Design Patterns and Model 2

557

Tools for your Design Toolbox


560

Exercise Solutions

561

xxii
Download at WoweBook.Com


13

Better Living with Patterns
Patterns in the Real World
Ahhhh, now you’re ready for a bright new world filled with
Design Patterns. But, before you go opening all those new doors of opportunity
we need to cover a few details that you’ll encounter out in the real world—things get a
little more complex out there than they are here in Objectville. Come along, we’ve got
a nice guide to help you through the transition...

ide to
The Objectville Gu
ns
h Design Patter
Better Living wit
patterns in the real

g with
& tricks for livin
handy guide of tips

Please accept ourguide you will:
world. In this
the definition of a
onceptions about
misc
mon
com
all too
b Learn the tern.”
just have to
“Design Pat
s
alog and why you
ign Pattern Cat
r those nifty Des
b Discove
.
get one.
at the wrong time
tern
Pat
ign
using a Des
embarrassment of
b Avoid the
belong.
they
e
wher
ns

catio
in classifi
to keep patterns
quick
b Learn how
the gurus; read our
erns isn’t just for
discovering pattpatt
r too.
b See that
me a erns write
beco
and
wTo
is revealed.
Ho
s Gang of Four
eriou
myst
the
of
tify
when the true iden
patterns user
b Be there
e table books any
coffe
the

s

with the neighbor
b Keep up
must own.
a Zen master.
Patterns mind like
train your Design
b Learn to
patterns
by improving your
rs
lope
deve
e
ds and influenc
b Win frien
vocabulary.

578

Design Pattern defined

579

Looking more closely at the Design Pattern definition

581

May the force be with you

582


Pattern catalogs

583

How to create patterns

586

So you wanna be a Design Patterns writer?

587

Organizing Design Patterns

589

Thinking in patterns

594

Your mind on patterns

597

Don’t forget the power of the shared vocabulary

599

Top five ways to share your vocabulary


600

Cruisin’ Objectville with the Gang of Four

601

Your journey has just begun...

602

Other Design Pattern resources

603

The Patterns Zoo

604

Annihilating evil with Anti-Patterns

606

Tools for your Design Toolbox

608

Leaving Objectville...

609


lm

rd He

Richa

Your Objectville guide

Ralph
Johnson

Gang of Four

John Vlissides
Erich Gamma

xxiii
Download at WoweBook.Com


×