Você está na página 1de 28

Elogios a Use a Cabea!

Padres de Projetos (Design Patterns)


Recebi o livro ontem e comecei a ler no caminho para casa... e no consegui parar. Levei-o para a academia e imagino
que as pessoas tenham me visto sorrindo bastante enquanto eu me exercitava e lia. O livro muito legal. divertido e
ao mesmo tempo eles cobrem vrios tpicos e vo direto ao assunto. Estou realmente impressionado.
- Erich Gamma, Engenheiro Laureado da IBM, e co-autor de Padres de Projetos

Use a Cabea! Padres de Projetos consegue misturar diverso, grandes risadas, profundidade tcnica e timos con-
selhos prticos em uma leitura divertida e inspiradora. Independentemente de ser um novato nos padres de projetos,
ou os ter usado por anos, voc certamente sair ganhando ao visitar a Objetolndia
- Richard Helm, co-autor de Padres de Projetos com o resto da Gang of Four
Erich Gamma, Ralph Johnson e John Vlissides

Me sinto como se uma pilha de mil livros tivesse acabado de ser tirada de cima da minha cabea
- Ward Cunningham, inventor do Wiki e fundador do Hillside Group

Este livro chega quase perfeio, por causa da maneira como ele combina o conhecimento e a facilidade de leitura. Ele
fala com autoridade e timo de ler. um dos muito poucos livros sobre software que j li e considero indispensveis.
(Eu colocaria talvez 10 livros nessa categoria, no mximo.)
- David Gelerneter, Professor de Cincia da Computao, Universidade de Yale e autor de
Mirror Worlds e Machine Beauty.

Um mergulho de cabea no reino dos padres, um lugar onde coisas complexas se tornam simples, mas onde coisas
simples podem tambm se tornar complexas. No consigo pensar em guias melhores do que os Freemans.
- Miko Matsummura, Analista da Indstria, The Middleware Company; Ex-Pregador Chefe do Java,
Sun Microsystems

Eu ri, eu chorei, o livro me emocionou


- Daniel Steinberg, Editor-em-Chefe, java.net

Minha primeira reao foi rolar de rir. Depois de me recompor, percebi que o livro no somente tecnicamente preciso,
como tambm a introduo aos padres de projetos mais fcil de entender que eu j vi.
-Dr. Timothy A. Budd, Professor Associado de Cincia da Computao na Universidade Estadual de Oregon
e autor de mais de uma dzia de livro, incluindo C++ para Programadores Java

Jerry Rice executa padres melhor do que qualquer jogador da NFL, mas os Freemans acabaram de super-lo. Mas
falando srio... este um dos livros mais engraados e inteligentes sobre projetos de software que eu j li.
- Aaron LaBerge , VP Technology, ESPN.com

Mais elogios a Use a Cabea! Padres de Projetos


Um timo projeto de cdigo , antes de mais nada, um timo projeto de informao. Um projetista de cdigo est
ensinando um computador como fazer algo, e no surpresa que a editora seja uma grande professora de progra-
madores. A clareza, o humor e as substanciais doses de inteligncia deste livro o tornam o tipo que ajuda at mesmo
no-programadores a pensar bem sobre como solucionar problemas.
- Cory Doctorow, co-editor de Boing Boing e autor de Down and Out in the Magic Kingdom e
Someone Comes to Town, Someone leaves Town

H um velho ditado na indstria de computadores e videogames bem, no pode ser to velho porque a prpria
indstria no velha assim que diz mais ou menos o seguinte: O Projeto Vida. O mais curioso sobre essa frase que
mesmo hoje em dia quase ningum que trabalha com a arte de criar jogos eletrnicos consegue chegar a um acordo
sobre o que signica projetar um jogo. O projetista um engenheiro de software? Um diretor de arte? Um contador
de histrias? Um arquiteto ou um pedreiro? Uma pessoa com os ps no cho ou um visionrio? possvel um mesmo
indivduo ter algo de todos esses papis? E, mais importante, quem liga para essa %$#&*?
J foi dito que o crdito projetado por em entretenimento interativo similar ao dirigido por na indstria dos lmes, o
que de fato permite ao nosso crdito compartilhar DNA com aquele que talvez o crdito mais controverso, exagerado, e
freqentemente sem nenhuma humildade j propagado na arte comercial. Boa companhia, hein? E mesmo assim, o Projeto
Vida, ento talvez seja hora de despendermos algum tempo pensando sobre o que ele . Eric e Elisabeth Freeman intre-
pidamente se ofereceram para explorar os mistrios do cdigo para ns em Use a Cabea! Padres de Projetos. No estou certo
de que qualquer um deles se importe tanto assim com o PlayStation ou o X-Box, e nem eles deveriam. Mesmo assim, eles
abordam a noo de projeto em um nvel signicativamente honesto, de forma tal que qualquer um procurando por elogios
aos seus prprios talentos como escritor deve car avisado de que ter uma boa lio de humildade ao ler este livro.
- Ken Goldstein, Vice-Presidente Executivo & Diretor Gerente, Disney Online

O livro tem o tom exato para o guru nerd e casualmente legal em todos ns. A referncia correta para estratgias prticas de
desenvolvimento faz o meu crebro funcionar sem ter de empurrar um monte de conversa velha e mofada de professor.
- Travis Kalanick, Fundador do Scour and Red Swoosh, membro do MIT TR100

Este livro combina bom humor, timos exemplos e conhecimento aprofundado dos Padres de Projetos de forma tal que
torna o aprendizado divertido. Trabalhando na indstria de tecnologia de entretenimento, eu tenho dvidas sobre o Princ-
pio Hollywood e o Padro Facade dos home theaters, entre outros. O entendimento dos Padres de Projetos no apenas nos
ajudam a criar bom software reutilizvel e fcil de manter, mas tambm ajuda a melhorar as nossas habilidades de resoluo
de problemas em vrias reas. Este livro indispensvel para todos os prossionais e estudantes de computao.
- Newton Lee, Fundador e Editor-Chefe, Association for Computing Machinerys (ACM)
Computers int Entertainment (acmcie.org.)

Elogios abordagem Use a Cabea!


A tecnologia Java est em toda parte em telefones celulares, cmeras, impressoras, jogos, PDAs, caixas eletrnicos,
smart cards, bombas de gasolina, estdios esportivos, dispositivos mdicos, web cams, servidores, entre outros. Se voc
desenvolve software e ainda no aprendeu Java, denitivamente est na hora de mergulhar Use A Cabea!.
Scott McNealy, Presidente e CEO da Sun Microsystems

rpido, irreverente, divertido e envolvente. Cuidado voc pode acabar realmente aprendendo algo!
Ken Arnold, ex-Engenheiro Snior da Sun Microsystems Co-autor (com James Gosling, criador do Java)
de The Java Programming Language

Use A Cabea! Java mais ou menos o que acontece quando o Monty Python encontra a gang of four... o texto to
bem dividido entre quebra-cabeas e estrias, testes e exemplos, que voc aprende com uma profundidade que nenhum
outro livro sobre computao oferece.
Douglas Rowe, Grupo de Usurios Java de Columbia

Use A Cabea! Java... d um novo signicado frase de marketing deles H um OReilly para isso. Eu escolhi este
aqui porque vrias pessoas que respeito o tinham descrito em termos como revolucionrio e ressaltando a abordagem
radicalmente diferente do livro-texto. Elas estavam (esto) certas... De modo tipicamente OReilly, eles usaram uma
abordagem cientca e bem pensada. O resultado engraado, irreverente, dividido em tpicos, interativo e brilhante...
Ler este livro como estar no saguo de uma conferncia tcnica, aprendendo e rindo com os seus pares... Se voc
quiser ENTENDER Java, v comprar este livro.
Andrew Pollack, www.thenorth.corn

Se voc quer aprender Java, achou o que procurava: bem-vindo ao primeiro livro tcnico com uma GUI! Este formato
perfeitamente executado e inovador oferece benefcios que outros textos sobre Java simplesmente no conseguem...
Prepare-se para uma viagem realmente notvel pela Javalndia.
Neil R. Bauman, Capito e CEO, Geek Cruises (www.GeekCruises.corn)

Que fantstica maneira de aprender!!! NO CONSIGO FECHAR ESTE LIVRO!!! Meu lho de 3 anos acordou
1h40 da madrugada e eu o coloquei de volta na cama com o livro e uma lanterna na mo, para poder continuar lendo
por cerca de mais uma hora.
Ross Goldberg
Use a Cabea
Padres e Projetos
2a Edio Revisada

No seria maravilhoso se
houvesse um livro sobre Padres
de Projetos que fosse mais
divertido que ir ao dentista
e mais revelador do que um
formulrio do Imposto de
Renda? Mas provavelmente isso
s uma fantasia...

Eric Freeman
Elisabeth Freeman

com
Kathy Sierra
Bert Bates

Rio de Janeiro 2009


Para a Gangue dos Quatro, cuja viso e conhecimentos em
matria de captura e comunicao sobre Padres de Projetos
mudou a face da concepo do software para sempre, e melho-
rado a vida dos desenvolvedores em todo o mundo.
Autores/Desenvolvedores de Use a Cabea Padres de Projetos
Eric Freeman um cientista da computao apaixonado por arquiteturas de mdia e de software. Ele acabou de concluir
quatro anos em um emprego dos sonhos dirigindo trabalhos de Internet banda larga e wireless na Disney e agora
est voltado a programar, criando softwares legais e tirando o mximo do Java e Macs.
Eric passou boa parte dos anos 90 trabalhando em alternativas metfora do desktop com David Gelernter (e os dois
ainda esto fazendo a pergunta por que eu tenho de dar um nome ao meu arquivo?). Com base nesse trabalho, Eric
obteve um Ph.D. na Yale University em 97. Foi tambm co-fundador da Mirror Worlds Technologies (agora adquirida
para criar uma verso comercial do trabalho da sua tese, o Lifestreams).
Em uma vida anterior, Eric criava software para redes e supercomputadores. Talvez voc o conhea de livros como
JavaSpaces Principles Patterns and Practice. Eric tem boas lembranas de implementar sistemas tuple-space em Thinking
Machine CM-5s e de criar alguns dos primeiros sistemas de informao Internet para a NASA, no nal dos anos 80.
Eric atualmente mora no deserto perto de Santa Fe. Quando no est escrevendo texto nem cdigo, voc o encontrar
passando mais tempo ajustando seus programas do que assistindo TV no seu home theater ou tentando consertar um
videogame do Dragons Lair dos anos 80. Ele tambm no se importaria de passar a noite como um DJ de msica ele-
trnica.Escreva para ele (em ingls) em eric@wickedlysmart.com ou visite o seu blog em http://www.ericfreeman.com.
Elisabeth Freeman escritora, desenvolvedora de software e artista digital. Ela esteve envolvida com a Internet desde
o princpio, sendo co-fundadora do The Ada Project (TAP), um premiado site voltado s mulheres que trabalham com
computao, adotado agora pela ACM. Mais recentemente, Elisabeth liderou trabalhos de pesquisa e desenvolvimento
em mdia digital na Walt Disney Company, onde co-inventou o Motion, um sistema de contedo que distribui terabytes
de vdeo todos os dias aos usurios da Disney, da ESPN e de Movies.com.
Elisabeth cientista da computao por formao e tem diplomas universitrios em Cincia da Computao pela Yale
University e pela Indiana University. Tem trabalhado em uma srie de reas, incluindo linguagens visuais, transmisses
RSS e sistemas Internet. Tem sido tambm uma ativista pelas mulheres na computao, desenvolvendo programas que
encorajam as mulheres a se envolverem na rea. Hoje em dia, voc a encontra bebendo caf ou achocolatado ao lado
do seu Mac, embora ela sonhe com o dia em que todo o mundo usar o Scheme.
Elisabeth sempre adorou caminhadas ao ar livre desde a sua infncia na Esccia. Quando est ao ar livre, sua cmera
est sempre ao seu alcance. Ela tambm uma vida ciclista, vegetariana e amante dos animais. Voc pode enviar um
e-mail para ela (em ingls) em beth@wickedlysmart.com.

Criadores da srie Use a Cabea! (e co-conspiradores neste livro)


Kathy se interessa por teoria da aprendizagem desde os seus Bert desenvolvedor
dias como designer de jogos (ela escreveu jogos para a Virgin, e arquiteto de software,
a MGM e a Amblin). Ela desenvolveu a maior parte do formato mas uma passagem de
Use a Cabea! enquanto ensinava Autorao de Novas Mdias no dez anos no campo de
programa de extenso Estudos de Entretenimento da UCLA. inteligncia articial le- Bert Bates
Mais recentemente, ela tem trabalhado como instrutora mster vou-o a se interessar por
para a Sun Microsystems, ensinando aos instrutores Java da Sun teoria da apren-dizagem Kathy Sierra
sobre como ensinar as tecnologias Java mais recentes e desenvol- e pelo trei-namento ba-
vendo vrios dos exames de certicao da Sun. Junto com Bert seado em tecnologia. Ele tem ensinado programao a clientes
Bates, ela tem usado ativamente os conceitos Use a Cabea! para desde ento. Recentemente, tornou-se membro da equipe de
ensinar a milhares de desenvolvedores. Kathy a fundadora do desenvolvimento de vrios dos exames de Certicao Java
javaranch.com, que recebeu em 2003 e 2004 o prmio Jolt Cola da Sun, incluindo o novo SCBCD.
Productivity Award, da revista Software Development. Tambm
possvel encontr-la dando aulas de certicao Java no site Ele passou a primeira dcada da sua carreira em software via-
Java Jam Geek Cruise (geekcruises.com). jando pelo mundo para ajudar clientes broadcast como a Rdio
Nova Zelndia, o Weather Channel e a rede Arts & Entertain-
Recentemente se mudou da Califrnia para Boulder, Colorado, ment (A & E). Um dos seus projetos favoritos foi a criao de
onde teve que aprender novas palavras, como limpador de um sistema completo de simulao de malha ferroviria para
gelo e pele, mas pelo menos l possvel esquiar. Gosta de: a Union Pacic Railroad.
correr, esquiar, andar de skate, brincar com seu cavalo islands e
de cincia esquisita. No gosta de: entropia. Um artigo de uma Bert um jogador viciado de go de longa data e tem trabalhado
revista uma vez a descreveu como persuasiva. Ela ainda est em um programa de go por tempo demais. Ele um guitarrista
tentando descobrir se eles disseram isso no bom sentido. Se voc razoavelmente bom e agora est tentando aprender banjo. Es-
souber, ou se tiver qualquer outro comentrio, escreva para ela creva para ele (em ingls) em terrapin@wickedlysmart.com.
(em ingls) em kathy@wickedlysmart.com.
VI
Tabela de Contedo (sumrio)
Introduo XV

1 Bem-vindo aos Padres de Projetos: uma introduo 1


2 Mantendo os seus Objetos atualizados: o Padro Observer 27
3 Decorando Objetos: o Padro Decorator 57
4 Cozinhando com a polpa da programao OO: o Padro Factory 79
5 Objetos nicos: o Padro Singleton 125
6 Encapsulando a Chamada de Mtodos: o Padro Command 143
7 Como Ser Adaptvel: os padres Adapter e Facade 177
8 Encapsulando Algoritmos: o Padro Template Method 205
9 Colees bem administradas: os Padres Iterador e Composite 235
10 O Estado das Coisas: o Padro State 289
11 Controlando o Acesso de Objetos: o Padro Proxy 325
12 Padres de Padres: Padres Compostos 373
13 Padres no Mundo Real: Vivendo Melhor com os Padres 435
14 Apndice: Padres Restantes 459

Tabela de Contedo (de verdade)

Introduo

Sua mente concentrada nos Padres de Projetos. Aqui voc est tentando aprender algo, enquanto o seu crebro est lhe
fazendo um favor certicando-se de que o aprendizado no se manter. Seu crebro est pensando: melhor deixar espao
para coisas mais importantes, como quais animais selvagens evitar e fazer esqui na neve pelado uma m idia. Ento,
como voc engana o seu crebro para faz-lo pensar que a sua vida depende de aprender os Padres de Projetos?
A quem se destina este livro? XVI
Sabemos o que voc est pensando XVI
E sabemos o que o seu crebro est pensando XVI
Metacognio: pensando sobre o pensamento XVIII
Eis o que VOC pode fazer para obrigar seu crebro a obedec-lo XIX
Revisores Tcnicos XXII
Agradecimentos XXII

Introduo aos Padres de Projetos

1 Bem-vindo aos Padres de Projetos


Algum j resolveu os seus problemas. Neste captulo, voc aprender por que (e como) pode se aproveitar da sabedoria e
das lies aprendidas por outros desenvolvedores que tenham passado pelo mesmo campo minado dos problemas de projetos
e tenham sobrevivido viagem. Antes de terminarmos, veremos o uso e os benefcios dos padres de projetos, veremos alguns
princpios chaves dos projetos OO, e o guiaremos atravs de um exemplo de como um padro funciona. A melhor maneira
de usar os padres carregando-os no seu crebro e depois reconhecendo lugares de seu projeto e das suas aplicaes existentes
onde pode aplic-los. Em vez de reutilizao de cdigo, com padres voc tem uma reutilizao de experincia.

Lembre-se: conhecer conceitos como abstrao, herana e polimorsmo no o torna um bom projetista orientado a
objetos. Um guru dos projetos pensa sobre como criar projetos exveis que sejam fceis de manter e modicar.
Comeou com um simples aplicativo SimUDuck 2
Joe pensa sobre herana... 4
Que tal uma interface? 4
A constante no desenvolvimento de software 6
Separando o que muda do que ca igual 7
Desenvolvendo os comportamentos de Duck 8
Testando o cdigo Duck 13
Congurando o comportamento de forma dinmica 14
Uma viso geral dos comportamentos encapsulados 16
TEM-UM pode ser melhor do que -UM 17
E por falar em Padres de Projetos... 18
O poder de um vocabulrio de padro compartilhado 21
Como usar os Padres de Projetos? 21
Ferramentas para sua caixa de ferramentas de projeto 23
Soluo dos exerccios 26

VII
O Padro Observer

2 Mantendo os seus Objetos informados

No durma no ponto quando algo interessante acontecer! Temos um padro que mantm os seus objetos informados
quando algo que possa lhes interessar acontece. Os objetos podem at mesmo decidir, no momento da execuo, se
querem ser mantidos informados ou no. O Padro Observer um dos mais usados do JDK e incrivelmente til. Antes
de terminarmos, veremos tambm as relaes de um para muitos e o acoplamento solto (sim, isso mesmo, ns dissemos
acoplamento). Com o Observer, voc ser a alma da Festa dos Padres.
Viso geral do aplicativo Weather Monitoring 28
Conhea o Padro Observer 32
Editora + Assinantes = Padro Observer 32
Cinco minutos de teatro: um assunto para observao 35
O Padro Observer denido 36
O poder da Ligao Leve 38
Desenvolvendo a Estao Meteorolgica 40
Implementando a Estao Meteorolgica 40
Usando o Padro Observer interno de Java 45
Retrabalhando a Estao Meteorolgica no suporte interno 48
Ferramentas para sua caixa de ferramentas de projeto 52
Solues dos exerccios 55

O Padro Decorator

3 Decorando Objetos

Chame este captulo de Olho de design para o garoto da herana. Examinaremos novamente o tpico uso excessivo
da herana e voc aprender a decorar suas classes no tempo de execuo usando uma forma de composio de objeto.
Por qu? Depois que voc descobrir as tcnicas de decorao, poder dar novas responsabilidades a seus objetos (ou de
outra pessoa) sem fazer nenhuma mudana de cdigo nas classes bsicas.

Eu achava que homens de verdade subclassicavam tudo. Isso at eu aprender o poder da extenso no tempo de exe-
cuo, em vez de no tempo de compilao. Olhe s para mim agora!
Fundamentos OO
Bem-vindo ao Starbuzz Coffee 58 Abstrao
O Princpio Aberto-Fechado 63 Encapsulamento
Siga o Padro Decorator 64 Polimorsmo
ios OO Herana varia.
Construindo um pedido de bebida com Decoradores 64 Princp qu e
p s u le o posi-
O Padro Decorator denido 65 En c a
r id a d e com na.
a
Decorando nossas bebidas 66 D prio elao her e,
o e m r ter ac
f
Escrevendo o cdigo do Starbuzz 69
r a m e para in aes.
Decoradores do mundo real: Java I/O 73 Prog ent
p a r a implem vemente
Escrevendo seu prprio Decorador Java I/O 74 no s le
design que
Ferramentas para sua caixa de ferramentas de projeto 76 Busque ntre objetos
s e
Solues dos exerccios 77 ligado m.
e
interag

O Padro Factory

4 Cozinhando com a polpa da programao OO


Prepare-se para cozinhar alguns projetos OO com acoplamento solto. Para se criar objetos, preciso mais do que
apenas usar o operador new. Voc aprender que a chamada uma atividade que no deve ser feita sempre em pbli-
co e pode freqentemente levar a problemas de acoplamento. E voc no quer que isso acontea, quer? Descubra como os
Padres Factory podem ajudar a salv-lo de dependncias embaraosas.
Quando voc vir new, pense em concret 80
O que h de errado com o new 81
Encapsulando a criao de objetos 82
VIII
Construindo uma fbrica simples de pizza 83
O Simple Factory denido 85
Franqueando a pizzaria 86
Deixando as sub-classes decidirem 87
Vamos criar uma PizzaStore 89
Declarando um mtodo Factory 90
Finalmente chegou a hora de conhecer o Padro Factory Method 95
Outra perspectiva: hierarquias de classes paralelas 95
Padro Factory Method denido 97
Uma pizzaria muito dependente 99
Analisando as dependncias dos objetos 100
O Princpio da Inverso de Dependncia 100
Enquanto isso, de volta PizzaStore... 104
Famlias de ingredientes... 105
Construindo as nossas fbricas de ingredientes 105
Retrabalhando as Pizzas 108
Padro Abstract Factory denido 113
Comparao entre Factory Method e Abstract Factory 116
Ferramenta para a sua Caixa de Ferramentas de Projetos 118
Solues dos exerccios 120

O Padro Singleton

5 Objetos nicos
O Padro Singleton: o seu ingresso para criar objetos nicos, para os quais h apenas uma instncia. Talvez voc que
contente de saber que, de todos os padres, o Singleton o mais simples em termos do diagrama das suas classes; na
verdade, o diagrama possui apenas uma classe! Mas no se sinta vontade demais; apesar da sua simplicidade de um
ponto de vista do design das classes, encontraremos algumas ondulaes e alguns buracos na pista da sua implementa-
o. Ento aperte o cinto este aqui no to simples quanto parece...
O Pequeno Singleton 127
Dissecando a implementao clssica do Padro Singleton 128
Entrvista desta semana: Consses de um Singleton 129
A Fbrica Chocolate 130
Padro Singleton denido 132
Hershey, PA
Huston temos um problema... 132
Seja o JVM 133
Lidando com vrios segmentos 134
Podemos melhorar os vrios segmentos? 134
Ferramentas para sua caixa de ferramentas de projeto 138
Solues dos Exerccios 141

O Padro Command

6 Encapsulando a Chamada de Mtodos


Neste captulo, levaremos o encapsulamento a um novo nvel: vamos encapsular a chamada de mtodos. isso mesmo
quando encapsulamos a chamada de mtodos, podemos cristalizar partes da computao para que o objeto que est invocando
esse processo no precise saber como as coisas so feitas. Ele s precisa usar o mtodo cristalizado para executar a tarefa.
O encapsulamento das chamadas de mtodos tambm nos permite fazer algumas coisas muito engenhosas, como salvar os
mtodos encapsulados para ns de registro ou reutiliz-los para implementar recursos de desfazer no nosso cdigo.
Automao domstica ou But 144
Hardware grtis! Vamos examinar o Controle Remoto 145
Examinando as classes de vendedor 145
Enquanto isso, de volta ao Restaurante 147
Uma breve introduo ao Padro Command 147
Agora, vamos examinar mais detalhadamente a interao 148
Papis e Responsabilidades no Restaurante Objetolndia 148
Do Restaurante ao Padro Command 150
Nosso primeiro objeto de comando 151 IX
Denio do Padro Command 154
Denio do Padro Command: o diagrama de classes 155
Implementando o Controle Remoto 156
Testando o Controle Remoto 158
E agora vamos conferir a execuo do nosso teste do controle remoto 159
Chegou a hora de escrever aquela documentao 161
Hora de testar aquele boto Refazer! 164
Todo controle remoto precisa de um Modo de Festa! 167
Usando um macrocomando 168
Mais usos do Padro Command: enleirando solicitaes 170
Mais usos do Padro Command: registrando as solicitaes 171
Ferramentas para sua caixa de ferramentas de projeto 172
Solues dos Exerccios 175
s s e te m
u m a c la global
V e ri fi q u e s e um p onto
n a
S in g le to instncia e forne
uma
apenas ela.
so a
de aces
Os Padres Adapter e Facade

7 Como ser Adaptvel

Neste captulo, iremos tentar feitos to impossveis quanto colocar um objeto quadrado em um buraco redondo.
Parece impossvel? No quando temos os Padres de Projetos. Lembra-se do Padro Decorator? Ns embrulhamos os
objetos para dar a eles novas responsabilidades. Agora iremos embrulhar alguns objetos com um propsito diferente:
fazer com que as suas interfaces aparentem ser algo que no so. Por que faramos algo assim? Para podermos adaptar
um projeto que espera uma determinada interface a uma classe que implementa uma interface diferente. E no s
isso: enquanto estamos com a mo na massa, veremos tambm um outro padro que embrulha objetos para simplicar
as suas interfaces.
Estamos cercados de adaptadores 178
Adaptadores orientados a objetos 178
Explicando o Padro Adapter 182
Denindo o Padro Adapter 183
Adaptadores de objetos e de classes 184
Adaptadores no mundo real 187
Adaptando uma Enumerao a um Iterator 187
E agora algo diferente... 190
Todo Mundo Quer um Home Theater 191
Tomada de
Luzes, Cmera e Fachada! 193 Parede Europia
Construindo a fachada do seu home theater 194 Adaptador
Pino
Denio do Padro Facade 196 Americano
para CA para CA
O Princpio do Conhecimento Mnimo 197
Ferramentas para sua caixa de ferramentas de projeto 201
Solues dos Exerccios 203

O Padro Template

8 Encapsulando Algoritmos
J encapsulamos a criao de objetos, mtodos, interfaces complexas, patos, pizzas... o que vir depois? Vamos en-
capsular algoritmos para que as subclasses possam se conectar diretamente a uma computao a qualquer momento que
quiserem. Iremos aprender at mesmo um princpio de projetos inspirado em Hollywood.

Preparando algumas classes de caf e ch (em Java) 206


Senhor, posso abstrair seu Caf e seu Ch? 208
Aprimorando o projeto 209
Abstraindo prepareRecipe() 209
O que ns zemos? 212
Conhea o Template Method 212
Vamos fazer um pouco de ch 213
O que o Template Method pode fazer por ns? 214
Denindo o Padro Template Method 214
X
Aproveitando o gancho do Template Method 216
Usando o gancho 217
Fazendo um test-drive 218
O Princpio Hollywood 220
O Princpio Hollywood e o Template Method 220
Como Reconhecer um Template Method a Olho Nu 222
Ordenando dados com o Template Method 222
Temos alguns patos para ordenar 223
Comparando Patos com Patos 224
A construo da mquina de ordenar patos 226
O Swing dos Quadros 227
Applets 228
No debate desta noite, Template Method e Strategy comparam mtodos 229
Ferramentas para sua caixa de ferramentas de projeto 232
Solues dos Exerccios 233

Os Padres Iterator e Composite

9 Colees bem gerenciadas


Existem vrias maneiras de inserir objetos em uma coleo. Coloc-los em um Array, um Stack, uma Lista, um Mapa... voc
escolhe. Cada um tem as suas vantagens e desvantagens. Mas, quando o seu cliente quiser iterar atravs dos seus objetos, voc vai
deix-lo ver a sua implementao? Certamente esperamos que no! Isso simplesmente no seria prossional. No se preocupe
neste captulo voc ver como permitir aos seus clientes iterar atravs dos seus objetos sem jamais verem como voc armazena
os objetos. Voc aprender tambm como criar super colees de objetos capazes de saltar sobre algumas estruturas de dados
impressionantes em uma nica passada. Voc aprender tambm algumas coisas sobre a responsabilidade dos objetos.

Notcias: Fuso do Restaurante Objetolndia com a Panquecaria Objetolndia 236


Examinando os Itens do Menu 236
Podemos encapsular a iterao? 241
Conhea o Padro Iterato 243
Incorporando o Iterador ao Menu do Restaurante 244
Testando o nosso cdigo 246
Aprimorando o processo com java.util.Iterator 249
Denindo o Padro Iterator 252
Responsabilidade nica 254
Examinando o Menu do Caf 256
Iteradores e Colees 261
Iteradores e Colees em Java 5 262
Justamente quando achvamos que estava pronto... 265
Denindo o Padro Composite 267
Redesenhando os Menus com o Padro Composite 269
Implementando o Componente de Menu 270
Implementando o Item de Menu 271
Voltando ao Iterator 278
O Iterador Nulo 281
A mgica de Iterator & Composite juntos... 282
Ferramentas para sua caixa de ferramentas de projeto 286
Solues dos Exerccios 287

O Padro State

10 O Estado das Coisas


Um fato pouco conhecido: os Padres State e Strategy so irmos gmeos que foram separados ao nascer. Como voc
sabe, o Padro Strategy acabou se dando muito bem no negcio dos algoritmos intercambiveis. O Padro State, por
sua vez, tomou o caminho talvez mais nobre de ajudar objetos a controlarem seu comportamento atravs de mudanas
no seu estado interno: Repita comigo: eu sou bastante bom, eu sou bastante esperto, e isso o que importa.
Quebra queixos em java 314
Curso elementar de mquinas de estado 315
Escrevendo o cdigo 293
Teste preliminar 295
Voc j estava prevendo isto um pedido de modicao! 298 XI
O ESTADO confuso das coisas 299
Denindo as interfaces e classes 301
Implementando as nossas classes de estados 302
Refazendo a Mquina de Goma 303
Denindo o Padro State 310
Strategy x State 316
Quase esquecemos! 317
Ferramentas para sua caixa de ferramentas de projeto 320
Solues dos Exerccios 320

O Padro Proxy

11 Controlando o Acesso de Objetos


J brincou de tira bonzinho e tira malvado? Voc o tira bonzinho e fornece todos os seus servios de forma agradvel
e amistosa, mas voc no quer que todo mundo pea os seus servios, ento voc faz o tira malvado controlar o acesso a voc.
isso que os proxies fazem: controlam e gerenciam o acesso. Como voc ver, existem vrias maneiras pelas quais os
proxies substituem os seus respectivos objetos. Os proxies tm a fama de carregar chamadas a mtodos inteiros atravs
da Internet para os objetos que substituem; eles tambm tm a fama de pacientemente substituir alguns objetos bem
preguiosos.

Codicando o Monitor 326


O papel do proxy remoto 328
Acrescentando um proxy remoto ... 330
Curso bsico de mtodos remotos 330
Vista Panormica do RMI de Java 333
Denindo o Padro Proxy 348
Prepare-se para o Proxy Virtual 349
Projetando o Virtual Proxy para capas de CD 350
Como ImageProxy funcionar: 350
Escrevendo ImageProxy 351
Testando o Visualizador de Capas de CD 353
O que ns zemos? 354
Usando o Proxy da API Java para criar um proxy de proteo 357
Pea teatral em cinco minutos: a proteo dos objetos 359
Vista Panormica: criando um Proxy Dinmico para PersonBean 360
Primeiro passo: criando os Processadores de Chamadas 361
O Zoolgico de Proxies 366
Ferramentas para sua caixa de ferramentas de projeto 368
Solues dos Exerccios 369

Padres Compostos

12 Padres de Padres
Quem poderia adivinhar que os Padres conseguem trabalhar juntos? Tendo presenciado as exaltadas Conversas ao
P do Fogo (e voc ainda nem viu as pginas do Combate Mortal entre Padres, que o editor nos forou a remover do
livro), voc certamente no imaginaria que ocasionalmente os padres podem at conviver em paz. Bem, acredite ou
no, alguns dos esquemas mais poderosos da programao orientada a objetos baseiam-se na utilizao simultnea de
vrios padres. Portanto, prepare-se para subir mais um degrau no seu domnio dos padres: chegou a hora dos padres
compostos. Mas cuidado os seus colegas podem ter que sacric-lo se voc pegar a Febre dos Padres
Trabalhando juntos 374
Reunio de patos 374
O que ns zemos? 393
Viso panormica: o diagrama de classes 394
O Rei dos Padres Compostos 396
Conhecendo o Modelo-Visualizao-Controlador 397
Examinando o MVC atravs de lentes coloridas por padres 400 Frio
Usando o MVC para controlar a batida 402 Quente
Conhea a Visualizao do Java DJ 402
A Visualizao 405
XII
E agora o Controlador 408
Explorando Strategy 411
Adaptando o Modelo 411
Agora estamos prontos para o HeartController 412
Coisas para fazer 413
MVC e a Internet 414
Padres de Projetos e Modelo 2 419
Ferramentas para sua caixa de ferramentas de projeto 422
Solues dos Exerccios 423
Padres de Projetos e o Modelo 2 443
Ferramentas para a sua Caixa de Ferramentas de Projetos 446
Solues dos Exerccios 447

Vivendo Melhor com os Padres

13 Padres no Mundo Real


Ahh, agora voc est pronto para um brilhante mundo novo cheio de Padres de Projetos. Mas, antes de abrir todas
essas novas portas de oportunidades, precisamos abordar alguns detalhes que voc encontrar no mundo real as coisas
cam um pouco mais complexas l fora do que elas so na Objetolndia. Siga-nos, temos um bom guia para ajud-lo
na transio...

Guia da Objetoldia para uam Vida 436


Denindo o Padro de Projetos 436
Examinando mais atentamente a denio do Padro de Projetos 438
Que a fora esteja com voc 439
No Existem Perguntas Idiotas 441
Ento voc quer ser uma escritor de Padres de Projetos? 442
Organizando Padres de Projetos 443
Pensando em Padres 447
Padres da Mente 449
No se esquea do poder do vocabulrio compartilhado 450
As cinco melhores maneiras de compartilhar o seu vocabulrio 451
Rodando Objetolndia com a Gangue dos Quatro 451
Sua jornada est s comeando 452
Outras fontes de consulta sobre Padres de Projetos 453
O Zoolgico de Padres 453
Aniquilando o mal com os Anti-Padres 454
Ferramentas para sua caixa de ferramentas de projeto 456
Deixando Objetolndia 457
Solues dos Exerccios 458

14 Apndice: Padres Restantes 459

Nem todos podem ser os mais populares. Muitas coisas mudaram nos ltimos dez anos. Desde que saiu a primeira edio
de Padres de Projetos: Elementos de Software Reutilizado Orientado a Objetos, os desenvolvedores vm aplicando esses padres
milhares de vezes. Os padres que resumimos neste apndice so padres GoF (padres fundamentais originais) ociais
completos e de carteirinha, mas no so sempre usados com a mesma freqncia que os padres que exploramos at
aqui. Mas os padres deste apndice so eles mesmos excelentes e, se a situao exigir, voc deve ser capaz de aplic-los
com orgulho. O nosso objetivo neste apndice lhe dar uma idia geral do que so estes padres.

XIII
Outros ttulos da Srie Use a Cabea!
Use a Cabea Java
Use a Cabea Anlise & Projeto Orientado a Objetos (A&POO)
Use a Cabea Ajax Iniciao Rpida
Use a Cabea HTML com CSS e XHTML
Use a Cabea Servlets e JSP
Use a Cabea PMP
Use a Cabea SQL
Use a Cabea Desenvolvimento de Software
Use a Cabea JavaScript
Use a Cabea C#
Use a Cabea PHP & MySQL (2009)
Use a Cabea Fsica (2009)
Use a Cabea Algebra (2009)
Use a Cabea Ajax Profissional (2009)
Use a Cabea Estatstica
Use a Cabea Ruby on Rails

XIV
Como usar este livro

Introduo

No acredito que
colocaram isso em um
livro sobre padres de
projetos.

t a s eo , r es po n d em os perguEneltaes
N es o, P OR QU
que no querisscao laemr:uEmntlivro sobre padres
colocaram os?.
de projet

XV
Use a Cabea Padres de Projetos

A quem se destina este livro?


Voc provavelmente se
dar bem se souber C#
Se voc responder sim a todas estas perguntas: em vez de Java.
Voc sabe algo de Java? (No necessrio ser um especialista.)
Voc deseja aprender, entender, se lembrar e aplicar os padres de projetos, incluindo os princpios de design OO
sobre os quais os padres se baseiam?
Voc prefere uma conversa informal estimulante a aulas acadmicas secas e chatas?
ento este livro para voc.

Quem provavelmente deve evitar este livro?

Se voc responder sim a qualquer uma destas perguntas:


Voc totalmente iniciante em Java?
(No preciso ser um conhecedor avanado e, mesmo se voc no souber Java mas souber C#, provavelmente entender pelo
menos 80% dos exemplos de cdigo. Tambm possvel que voc se d bem tendo um background apenas em C++.)
Voc um designer/desenvolvedor OO experiente procurando um livro de referncia?
Voc um arquiteto procurando por padres de projetos corporativos?
Voc tem medo de experimentar algo novo? Voc prefere fazer um tratamento de canal a misturar uma camisa
verde com uma gravata cor-de-rosa? Voc no acredita que um livro tcnico no qual os componentes so antropo-
morzados possa ser srio?

ento este livro no para voc.

nota do departamento de mar keting:


este livro adequado par o. quer um que
a qual
tenha um carto de crdit
Sabemos o que voc est pensando.

Como isso aqui pode ser um livro de programao srio?


Pra que tantos desenhos?
realmente possvel aprender desta forma?

seu crebro acha que


E sabemos o que o seu crebro est pensando.
IST O importante.
O seu crebro tem sede de novidades. Ele est sempre buscando, atento, esperando por algo
fora do comum. Ele foi feito assim, e isso o ajuda a se manter vivo.
Hoje em dia, menos provvel que voc acabe virando o lanche de algum tigre. Mas o seu
crebro continua em alerta. Nunca se sabe.
Ento o que o seu crebro faz com todas as coisas rotineiras, comuns e normais que encontra?
Tudo o que puder para impedir que elas interram com verdadeiro trabalho do crebro re-
gistrar as coisas que so importantes. Ele no se d ao trabalho de armazenar as coisas chatas;
elas nunca passam pelo ltro isto obviamente no importante.
Como o seu crebro sabe o que importante? Suponha que voc saia para uma caminhada e
um tigre pule na sua frente, o que acontece dentro da sua cabea e do seu corpo?
Os neurnios disparam. As emoes aumentam. Os elementos qumicos borbulham.
E assim que o seu crebro sabe que...

XVI
Como usar este livro

Isto deve ser importante! No se esquea disto!


timo. S faltam
Mas imagine que voc esteja em casa, ou em uma biblioteca. uma rea mais 490 pginas
segura, aconchegante e sem tigres. Voc est estudando. Preparando-se entediantes, secas e
para um exame. Ou tentando aprender algum tpico tcnico difcil que chatas.
o seu chefe acha que s vai levar uma semana, dez dias no mximo.

Apenas um problema. O seu crebro est tentando lhe fazer um


c r eb ro acha ale
seu IST O no v r.
grande favor. Est tentando certicar-se de que este contedo
obviamente sem importncia no gaste recursos escassos. Recursos
esses que seriam melhor gastos armazenando as coisas realmente que na memoriza
importantes. Como tigres. Como o perigo do fogo. Como voc no
deve nunca mais praticar esqui na neve de calo.
a pe
E no existe nenhuma maneira simples de dizer ao seu crebro: ei,
crebro, muito obrigado, mas no importa o quanto este livro seja
chato, nem quanto eu estou marcando na escala Richter emocional
neste momento, eu realmente quero armazenar isto aqui.

o um aprendiz.
de Use a Cabea! com
Ns pensamos no leitor
ender, depois certicar-
para se apr end er algo? Primeiro voc tem que ent e as
Ento, o que necess rio tro da sua cabea. Conform
vai esquec er. N o se trata de empurrar fatos para den edu cao, apr end er
se de que no e psicologia da
mais recentes sobre cin cia cognitiva, neurobiologia a ao seu cr ebro.
pesqui sas emos o que inte ress
to em uma pgina. Ns sab
exige muito mais do que tex
a!:
aprendizado Use a Cabe
Alguns dos princpios do eis do que apenas
muito mais memorv
Use o visual. As imagens so 89% de precisa chamar servio remoto
end izado muito mais efetivo (at
as palavras e tornam o apr nc ia). Tam bm torna um m to do no RMI
brana e transfer servidor
melhoria em estudos de lem ue as palavras dentro per ou to
fce is de ent end er. Co loq
as coisas mais l ou em outra doCalc()
referem, em vez de no na
dos grcos a que elas se con seg uir em res olv er
de os aprendizes
pgina, e a probabilidade valor de
ado s ao con tedo poder dobrar. retorno
problemas relacion
dos recentes, os estu-
al e personalizado. Em estu
Use um estilo conversacion ra de at 40% no desempenho
dantes tiveram uma melho va
quando o contedo fala
em testes ps-aprendizado con ver sacion al, em
um estilo
realmente uma droga ser diretamente ao leitor, usando
di
um mtodo abstrato. No pes soa , em vez de se usar um tom formal. Conte
primeira
pr
se tem um corpo. as. Use Faz sentido dizer que a
histrias em vez de dar aul
hi
. N o se lev ea Banheira -UM Banheiro?
linguagem casual
li Ou o Banheiro -UMA
voc pre star ia ma is
srio demais. Em que
Banheira? Ou uma

sa interes san te dur ant e um relao TEM-UM?


ateno: em uma conver
jantar ou em uma aula?
no do leitor. Todos j
Consiga e mantenha a ate
rea lme nte quero aprender
tivemos a experincia eu
abstract void roam(); isto mas no consigo passar
da pgina um acordado.
o em coisas que saiam do
O seu crebro presta aten
san tes, estranhas, impres-
comum, que sejam interes
O mtodo no tem
ender um novo e difcil
corpo! Finalize-o com sionantes, inesperadas. Apr
ser enfadonho. O seu
ponto-e-vrgula. assunto tcnico no precisa
is rpido se no for.
crebro aprender muito ma
a sua capacidade de
Ns sabemos, hoje em dia, que
Envolva as emoes do leitor. cion al. Voc se lembra das coisas
ito do contedo emo
lembrar-se de algo depende mu , no estamos falando
se lembra quando sente algo. No
com as quais se importa. Voc orro. Estamos falando
o sobre um garoto e o seu cach
de histrias de partir o cora que isso ?, e da sensao de
s com o sur pre sa, cur iosidade, diverso, o
de emo e -cabea, aprende algo
ndo voc resolve um quebra
Eu sou demais! que vem qua e algo que o Bob eu
difcil ou percebe que voc sab
que as demais pessoas acham aria no sabe.
do departamento de engenh
sou mais tcnico do que vs
XVII
Use a Cabea Padres de Projetos

Metacognio: pensando sobre o pensamento Gostaria de saber


como fazer o meu
Se voc realmente deseja aprender, e quer aprender mais rpido e mais profunda- crebro se lembrar de
mente, preste ateno em como voc presta ateno. Pense sobre como voc pensa. tudo isto...
Aprenda sobre como voc aprende.
Muitos de ns no tivemos aulas sobre metacognio ou sobre teoria da aprendiza-
gem quando ramos estudantes. Esperava-se que ns aprendssemos, mas raramente
nos ensinavam a aprender.
Mas ns presumimos que, se voc est lendo este livro, porque realmente deseja
aprender os padres de projetos. E voc provavelmente no deseja gastar muito tempo.
E quer se lembrar do que l e ser capaz de aplic-lo. E, para isso, voc tem que entender
o que leu. Para tirar o mximo proveito deste livro, ou de qualquer livro ou experincia
de aprendizado, tome as rdeas do seu crebro. Faa-o se concentrar no contedo.
O segredo fazer o seu crebro ver o novo material que voc est aprendendo como
Realmente Importante. Crucial para o seu bem-estar. To importante quanto um
tigre. Caso contrrio, voc acabar em uma batalha constante com o seu crebro
fazendo o melhor que puder para impedir que o novo contedo seja registrado.

Ento COMO voc faz o seu crebro pensar que os Padres de Projetos so to
importantes quanto um tigre?
Existe a maneira lenta e tediosa e a maneira mais rpida e mais efetiva. A maneira lenta refere-se repetio exausti-
va. Voc obviamente sabe que capaz de aprender e memorizar at mesmo o assunto mais enfadonho, se se mantiver
batendo na mesma tecla. Repetindo o suciente, o seu crebro diz: Isto no parece importante, mas ele ca olhando
a mesma coisa repetidas e repetidas vezes, ento eu suponho que deve ser.
A maneira mais rpida fazer qualquer coisa que aumente a atividade cerebral, especialmente aumentando diferentes
tipos de atividades cerebrais. As coisas que voc viu na pgina anterior so uma grande parte da soluo, e elas so
todas coisas que comprovadamente ajudam o seu crebro a trabalhar em seu favor. Por exemplo, estudos mostram que
colocar palavras dentro das guras que elas descrevem (em vez de em algum outro lugar da pgina, como em uma
legenda ou no corpo do texto) faz o seu crebro tentar perceber em que sentido as palavras e a gura se relacionam,
e isso faz disparar mais neurnios. Mais neurnios disparados = maior a chance de o seu crebro perceber que isto
algo que vale a pena prestar ateno e possivelmente armazenar.
Um estilo conversacional ajuda porque as pessoas tendem a prestar mais ateno quando percebem que esto em uma
conversa, porque nessa situao espera-se que elas sigam o que est sendo dito e mantenham o seu lado da conexo
ativo. O incrvel que o seu crebro no necessariamente se importa se a conversa entre voc e um livro! Por outro
lado, se o estilo de escrita for formal e seco, o seu crebro o percebe da mesma forma como percebe quando voc est
ouvindo uma aula, sentado em uma sala cheia de alunos passivos. No preciso car acordado.
Mas guras e estilo conversacional so apenas o incio.

Eis o que NS zemos:


Usamos guras, porque o seu crebro est ajustado para imagens, e no texto. No que diz respeito ao seu crebro, uma
imagem realmente vale por 1.024 palavras. E, nos casos em que texto e imagens trabalham juntos, ns inserimos o texto nas
imagens, porque o seu crebro trabalha de modo mais ecaz quando o texto se encontra dentro da coisa a que se refere, em
vez de em uma legenda ou enterrado em alguma parte do texto.
Usamos a redundncia, dizendo a mesma coisa de diferentes
relao de um-para-muitos
formas e com diferentes tipos de mdia, e com mltiplos sentidos,
para aumentar a chance de o contedo ser codicado em mais de
uma rea do seu crebro. Objeto Cachorro

Usamos conceitos e imagens de formas inesperadas, porque o seu Objeto Subject


ndentes

crebro est ajustado para captar novidades, e usamos imagens


e idias com pelo menos algum contedo emocional, porque o Objeto Pato
objetos depe

Objeto Gato
seu crebro est ajustado para prestar ateno na bioqumica das
emoes. Aquilo que o faz sentir algo tem maior probabilidade de Atualizao/Noticao automtica

ser lembrado, mesmo se o sentimento no passar de um pouco de Objeto Rato

humor, surpresa ou interesse. Observadores

XVIII
Como usar este livro

Usamos um estilo personalizado, conversacional, porque o seu crebro est ajustado para prestar
mais ateno quando acredita que voc est em uma conversao do que quando pensa que voc est
ouvindo passivamente uma apresentao. Seu crebro faz isso mesmo quando voc est lendo.

Inclumos mais de 40 atividades, porque o seu crebro est ajustado para aprender e memorizar mais
quando voc faz coisas do que quando voc l sobre as coisas. E zemos os exerccios desaadores,
porm solucionveis, porque isso que a maioria das pessoas prefere.

Usamos mltiplos estilos de aprendizado, porque voc poderia preferir procedimentos passo-a-passo, O Guru dos Padres
enquanto outra pessoa pode desejar entender o geral primeiro, e uma outra poderia apenas querer ver
um exemplo de cdigo. Porm, independentemente da sua preferncia em termos de aprendizado,
todos se beneciaro de ver o mesmo contedo representado em mltiplas maneiras.

Inclumos contedo para ambos os hemisfrios do crebro, porque, quanto mais do seu crebro voc
ativa, maior a probabilidade de voc aprender e memorizar, e maior o tempo durante o qual voc pode
se manter concentrado. Uma vez que trabalhar apenas um lado do crebro freqentemente signica
dar ao outro lado uma chance para descansar, voc pode ter maior produtividade no aprendizado Pontos Importantes
por um perodo de tempo maior.

E inclumos histrias e exerccios que apresentam mais de um ponto de vista, porque o seu crebro est
ajustado para aprender com mais profundidade quando forado a fazer avaliaes e julgamentos.

Inclumos desaos, com exerccios e fazendo perguntas que nem sempre tm uma resposta direta, Quebra-cabeas
porque o seu crebro est ajustado para aprender e memorizar quando precisa trabalhar em algo.
Pense no seguinte: no possvel car em forma apenas olhando as pessoas na academia de ginstica.
Mas zemos o nosso melhor para nos certicarmos de que voc estar trabalhando duro, e nas coisas
certas. Que voc no est gastando uma dendrite extra para processar um exemplo difcil de entender,
ou traduzindo um texto difcil, cheio de jargo ou exageradamente conciso.

Usamos pessoas em histrias, exemplos, guras etc., porque, bem, porque voc uma pessoa. E o
seu crebro presta mais ateno em pessoas do que em coisas.

Usamos uma abordagem 80/20. Partimos do princpio de que, caso voc v tentar um PhD em pro-
jetos de software, este no vai ser o seu nico livro. Assim, no falamos sobre tudo. Apenas sobre as
coisas que voc de fato ir usar.

Eis o que VOC pode fazer para obrigar seu crebro a obedec-lo

OK, zemos a nossa parte. O resto depende de voc. Estas dicas so um ponto de par-
tida; escute o seu crebro e descubra o que funciona para voc e o que no funciona.
Experimente coisas novas.
e
e isto
Recort ta
a por
c o l e n eira
lad
da sua ge

XIX
Use a Cabea Padres de Projetos

V com calma. Quanto mais voc entende, menos voc Beba gua. Muita gua.
precisa memorizar. O seu crebro funciona melhor envolvido por bastante
No leia, apenas. Pare e pense. Quando o livro lhe zer uido. A desidratao (que pode ocorrer antes de voc
uma pergunta, no pule direto para a resposta. Imagine sequer sentir sede) diminui a capacidade cognitiva.
que algum est realmente fazendo lhe a pergunta. Quan-
to mais profundamente voc fora seu crebro a pensar,
maior a sua chance de aprender e memorizar. Fale sobre o assunto. Em voz alta.
Falar ativa uma parte diferente do crebro. Se estiver
tentando entender algo, ou aumentar a sua chance de
Faa os exerccios. Escreva as suas prprias notas. se lembrar do assunto depois, pronuncie-o em voz alta.
Ns os inclumos, mas, se os resolvssemos para voc, Melhor ainda, tente explic-lo em voz alta para algum.
seria como ter algum fazendo os seus abdominais para Voc aprender mais rapidamente e poder descobrir
voc. E no olhe os exerccios simplesmente. Use um idias que voc nem suspeitava que estavam l antes de
lpis. H muita evidncia de que atividade fsica durante comear a ler.
o aprendizado pode melhor-lo.
Oua o seu crebro.
Preste ateno se o seu crebro est cando sobrecarre-
Leia as sees Perguntar no ofende/No existem gado. Se voc se pegar comeando a ler supercialmente
perguntas idiotas. ou esquecendo o que acabou de ler, hora de fazer uma
Isso signica todas elas. Elas no so enfeites opcionais pausa. Depois de passar de um certo ponto, voc no vai
fazem parte do contedo central! No as pule. aprender mais rpido tentando inserir mais informaes
e poder at prejudicar o processo.
Faa deste livro a sua ltima leitura antes de dormir.
Ou pelo menos a ltima leitura desaadora.
Parte do aprendizado (especialmente a transferncia Sinta algo!
para a memria de longo prazo) acontece depois que O seu crebro precisa saber que isto importante. En-
voc fecha o livro. O seu crebro precisa tirar um tempo volva-se com as estrias. Crie as suas prprias legendas
para fazer mais processamentos. Se voc acrescentar algo para as fotos. Resmungar sobre uma piada ruim ainda
durante esse tempo de processamento, parte do que voc melhor do que no sentir nada.
acabou de aprender se perder.
Projete algo!
Aplique o contedo a algo que voc esteja projetando ou
refatore um projeto antigo. Apenas faa algo para obter
alguma experincia alm dos exerccios e atividades deste
livro. Tudo de que voc precisa um lpis e um problema
para resolver... um problema que possa se beneciar de
um ou mais padres de projetos.
Leia-me
Isto uma experincia de aprendizagem, no um livro de referncia. Ns deliberadamen- Usamos um pseudo-UML
modicado mais simples
te retiramos tudo o que poderia atrapalhar o aprendizado do que quer que estivssemos
apresentando na parte do livro em questo. E, na primeira leitura, voc precisa comear do
comeo, porque o livro faz assunes sobre o que voc j viu e aprendeu.

Usamos diagramas simples semelhantes a UML.


Embora seja bastante provvel que voc conhea a UML, no a abordamos no livro, nem
um pr-requisito para a sua leitura. Caso voc nunca tenha visto UML antes, no se preocupe,
daremos a voc algumas dicas no caminho. Assim, em outras palavras, voc no ter que se
preocupar com Padres de Projetos e UML ao mesmo tempo. Os nossos diagramas so pseudo-UML embora ten-
temos ser is UML, em alguns momentos iremos distorcer as regras um pouco, normalmente por causa das nossas
prprias razes artsticas egostas.

No abordamos todos os Padres de Projetos j criados.


Existem muitos Padres de Projetos: os padres fundamentais originais (conhecidos como padres GoF), os padres
J2EE da Sun, os padres JSP, padres arquiteturais, padres de projetos de jogos e muitos mais. Mas o nosso objetivo foi
nos certicarmos de que o livro pesaria menos do que a pessoa que o esteja lendo, ento no abordamos todos eles aqui.
O nosso foco nos padres centrais importantes dentre os padres GoF originais e em nos certicarmos de que voc

XX
Como usar este livro

realmente, sinceramente, profundamente entenda como e quando us-los. Voc encontrar uma breve meno a alguns
dos outros padres (os muito menos provveis que voc v usar) no apndice. Em todo caso, depois de terminar o Use
a Cabea! Padres de Projetos, voc ser capaz de pegar qualquer catlogo de padres e entrar em ao rapidamente.

As atividades NO so opcionais.
Os exerccios e as atividades no so adicionais; eles fazem parte do contedo central do livro. Alguns deles servem para
ajudar a memorizar, outros a entender, e alguns para ajud-lo a aplicar o que voc aprendeu. No pule os exerccios.
As palavras cruzadas so as nicas coisas que voc no precisa fazer, mas so boas para dar ao seu crebro uma chance
de pensar sobre as palavras a partir de um contexto diferente.

Usamos a palavra composio no sentido OO geral, que mais


flexvel do que o uso estrito de composio em UML.
Quando dizemos que um objeto composto com outro objeto, queremos dizer que eles se relacionam de forma
TEM-UM. O nosso uso reete o uso tradicional do termo e o mesmo empregado no texto GoF (voc aprender
o que isso mais tarde). Mais recentemente, a UML renou esse termo em vrios tipos de composio. Se for um
expert em UML, ainda assim voc poder ler o livro e dever ser capaz de mapear facilmente o uso de composio
para os termos mais renados, medida que for lendo.

A redundncia intencional e importante.


Uma diferena distinta em um livro Use a Cabea! que queremos que voc realmente entenda. E queremos que voc
termine o livro lembrando-se do que aprendeu. A maioria dos livros de referncia no tm a reteno e a lembrana
como objetivo, mas este livro sobre aprendizado, ento voc ver alguns conceitos aparecerem mais de uma vez.

Os exemplos de cdigos so os mais enxutos possveis.


Os nossos leitores nos dizem que frustrante percorrer 200 linhas de cdigo procurando as duas linhas que eles preci-
sam entender. A maioria dos exemplos deste livro mostrada dentro do menor contexto possvel, para que a parte que
voc est tentando aprender esteja clara e simples. No espere que todo o cdigo seja robusto, ou mesmo completo os
exemplos so escritos especicamente para o aprendizado, e no so sempre totalmente funcionais.

Em alguns casos, no inclumos todos os comandos import necessrios, mas presumimos que, se voc um programa-
dor de Java, voc saber que ArrayList se encontra em java.util, por exemplo. Quando o contedo importado no zer
parte da API J2SE normal, ns o mencionaremos. Tambm colocamos todo o cdigo-fonte na web, para que voc possa
baix-lo. Voc o encontrar em http://www.altabooks.com.br

Alm disso, para nos concentramos na questo do aprendizado do cdigo, no colocamos as nossas classes em pacotes
(em outras palavras, elas esto todas no pacote padro Java). No recomendamos isso no mundo real, e, quando voc
baixar os exemplos de cdigos deste livro, ver que todas as classes esto em pacotes.

Os exerccios Poder da Mente no tm respostas.


Para alguns deles, no h uma resposta certa; para outros, parte da experincia de aprendizado das atividades Poder da
Mente requer que voc decida se e quando as suas respostas esto corretas. Em alguns dos exerccios Poder da Mente,
voc encontrar dicas para lhe apontar a direo correta.

XXI
Use a Cabea Padres de Projetos

Revisores Tcnicos
Valentin Crettaz
Jef Cumps Barney Marispini

Ike Van Attaa


O destemido lder da Equipe
Radical dos Revisores do UCPP
Jason Menard
Johannes de Jong

Dirk Schreckmann
Mark Spritzler
Em memria de Philippe Maquet
1960-2004
O seu impressionante conhecimento tcnico, seu entusiasmo inacabvel e a sua profunda
preocupao com o leitor sempre iro nos inspirar.

Nunca te esqueceremos.

Philippe Maquet
Agradecimentos

Na OReilly:
O nosso muito obrigado a Mike Loukides da OReilly, por ter comeado tudo e ajudado a dar forma ao conceito Use a
Cabea!, transformando-o em uma srie. E um grande obrigado ao motor por trs da srie Use a Cabea!, Tim OReilly.
Obrigado inteligente mame da srie Use a Cabea! Kyle Hart, estrela do rock and roll Ellie Volkhausen pelo seu
inspirado desenho da capa e tambm a Colleen Gorman pela sua infalvel preparao dos originais. Finalmente, obrigado
a Mike Hendrickson por vestir a camisa deste livro de Padres de Projetos e por ter criado a equipe.

XXII
Como usar este livro

Os nossos intrpidos revisores:


Somos extremamente gratos ao nosso diretor de reviso tcnica Johannes deJong. Voc o nosso heri, Johannes. E apre-
ciamos profundamente as contribuies do co-diretor da equipe de reviso Javaranch, o saudoso Philippe Maquet. Voc
sozinho iluminou a vida de milhares de desenvolvedores, e o impacto que teve nas suas (e nas nossas) vidas ser eterno.
Jef Cumps assustadoramente bom em encontrar problemas nos esboos dos nossos captulos e, mais uma vez, fez uma
enorme diferena para o livro. Obrigado, Jef! Valentin Cretazz (da AOP), que esteve conosco desde o primeiro livro Use
a Cabea!, provou (como sempre) o quanto ns realmente precisamos do seu conhecimento tcnico e da sua inspirao.
Voc o cara, Valentin (mas jogue fora a gravata).
Dois recm-chegados equipe de reviso UC, Barney Marispini e Ike Van Atta, zeram um trabalho primoroso no
livro vocs nos deram um feedback realmente crucial. Obrigado por se juntarem equipe.
Tambm obtivemos excelente ajuda tcnica dos moderadores/gurus do Javaranch Mark Spritzler, Jason Menard,
Dirk Schreckmann, Thomas Paul e Margarita Isaeva. E, como sempre, obrigado especialmente ao chefo do java-
ranch.com, Paul Wheaton.
Obrigado aos nalistas do concurso Escolha a Capa do Use a Cabea! Padres de Design. O vencedor, Si Brewster,
enviou o ensaio vencedor que nos convenceu a escolher a mulher que voc v na nossa capa. Outros nalistas foram
Andrew Esse, Gian Franco Casula, Helen Crosbie, Pho Tek, Helen Thomas, Sateesh Kommineni e Jeff Fisher.

Ainda mais gente*

de Eric e Elisabeth
Escrever um livro da srie Use a Cabea! um passeio emocionante com dois guias incrveis: Kathy Sierra e Bert Bates.
Com Kathy e Bert voc joga fora todas as convenes de escrita de livros e adentra um mundo cheio de histrias para
contar, teoria de aprendizagem, cincia cognitiva e cultura pop, onde o leitor sempre quem manda. Obrigado a ambos
por nos deixar entrar no seu mundo maravilhoso; esperamos ter feito justia srie Use a Cabea!. Falando srio, foi
uma experincia incrvel. Obrigado por toda a sua cuidadosa orientao, nos levando sempre adiante e, acima de tudo,
por conar a ns o beb de vocs. Vocs dois so certamente incrivelmente espertos e tambm so as pessoas de 29
anos mais legais que conhecemos. Ento... quem mais?
Um muito obrigado a Mike Loukides e a Mike Hendrickson. Mike L. esteve conosco a cada passo do caminho. Mike, o
seu inspirado feedback nos ajudou a dar forma ao livro e o seu encorajamento nos manteve seguindo em frente. Mike
H., obrigado pela sua persistncia ao longo de cinco anos tentando nos fazer escrever um livro sobre padres; nalmente
o zemos e estamos felizes de termos esperado pela srie Use a Cabea!.
Um obrigado muito especial a Erich Gamma, que fez muito mais do que o seu dever ao revisar este livro (ele at le-
vou um esboo consigo nas suas prprias frias). Erich, o seu interesse neste livro nos inspirou e a sua reviso tcnica
completa o melhorou imensamente. Obrigado tambm a toda a Gang of Four pelo seu suporte e interesse, e por fazer
uma apario especial na Objetolndia. Estamos em dbito tambm com Ward Cunningham e com a comunidade dos
padres, que criaram o Portland Pattern Repository (Repositrio de Padres de Portland) um recurso indispensvel
para ns ao escrevermos este livro.
preciso toda uma cidade para escrever um livro tcnico: Bill Pugh e Ken Arnold nos forneceram aconselhamento
especializado sobre o Singleton. Joshua Marinacci forneceu dicas e aconselhamentos inestimveis. O trabalho Why a
Duck? (Por que um Pato?) de John Brewer inspirou o SimUDuck (e camos felizes por ele gostar de patos tambm).
Dan Friedman inspirou o exemplo Little Singleton. Daniel Steinberg agiu como a nossa ligao tcnica e a nossa rede
de suporte emocional. E obrigado a James Dempsey da Apple por nos permitir usar a sua cano sobre o MVC.
Finalmente, um obrigado pessoal equipe de reviso do Javaranch pelas suas excelentes revises e o seu suporte calo-
roso. H mais de vocs neste livro do que vocs pensam.

XXIII
Use a Cabea Padres de Projetos

De Kathy e Bert
Gostaramos de agradecer a Mike Hendrickson por encontrar Eric e Elisabeth... mas no podemos. Por causa desses dois,
ns descobrimos (para o nosso horror) que no somos os nicos capazes de escrever um livro Use a Cabea!.;) Porm,
se os leitores quiserem acreditar que foram realmente a Kathy e o Bert que zeram as coisas legais do livro, bem, quem
somos ns para corrigir os leitores?

*O grande nmero de agradecimentos se deve ao fato de estarmos


testando a teoria de que todas as pessoas mencionadas em uma lista
de agradecimentos de um livro compraro pelo menos uma cpia, e
provavelmente mais, com os parentes e tudo o mais. Se voc quiser
estar na lista de agradecimentos do nosso prximo livro e tiver uma
grande famlia, escreva para ns.
XXIV
1 Introduo aos Padres de Projetos

Bem-vindo aos
Padres de Projetos

Agora que estamos


morando em Objectville, temos que
entrar nos Padres de Projetos...
todo mundo est fazendo isso. Logo,
seremos a sensao do grupo de
padres de Jim e Betty nas
quartas-feiras noite!

Algum resolveu seus problemas. Neste captulo, voc saber


por que (e como) pode explorar o conhecimento e as lies apren-
didas por outros desenvolvedores que tiveram o mesmo problema
de design e sobreviveram. Antes de terminarmos, vamos analisar o
uso e os benefcios dos padres de projetos, ver alguns princpios
importantes de design OO e dar um exemplo de como um padro
funciona. A melhor maneira de usar os padres carregar seu
crebro com eles e depois reconhecer locais em seus designs e
aplicativos existentes onde eles possam ser aplicados. Em vez da
reutilizao de cdigo, com os padres voc obtm a reutilizao
de experincia.

1
Use a Cabea Padres de Projetos

Comeou com um simples aplicativo SimUDuck


Joe trabalha para uma empresa que cria um jogo de simulao de lago com patos de grande sucesso,
o SimUDuck. O jogo pode mostrar uma grande variedade de espcies de pato nadando e produzindo
sons. Os designers iniciais do sistema usaram tcnicas OO padro e criaram uma superclasse Duck
(Pato) herdada por todos os outros tipos de pato.

Todos os patos grasnam e Duck

nadam, a superclasse cuida quack()

do cdigo de implementao.
swim()
display() O mtodo display() abstrato
// OUTROS mtodos pareci-
dos com duck... j que todos os subtipos de pato
so diferentes.

s ubt ipo dse vel p o s d e p ato


Cadao responntar o s o u t ros tDi uck.
pat impleme MallardDuck RedheadDuck
Muidtam da classe
poru prprio nto display() { display() {
her
se portame a o modo // parece um pato bravo } // parece um cabea-vermelha }

com play() par e na tela.


dis o aparec
com
Ano passado, a empresa esteve sob presso crescente dos concorrentes. Aps uma sesso de brainstorming de uma
semana jogando golfe, os executivos da empresa acham que est na hora de fazer uma grande inovao. Eles precisam
de algo realmente impressionante para mostrar na reunio de acionistas em Maui na semana seguinte.

S preciso adicionar um
Mas agora precisamos dos patos para VOAR mtodo y() classe Duck
e depois todos os patos iro
Os executivos decidiram que fazer os patos voarem o que o simulador para acabar herd-lo. a hora de eu mostrar
com a concorrncia. E claro que o gerente de Joe disse a eles que Joe poderia criar que sou mesmo um gnio OO.
algo em uma semana. Anal, disse o chefe de Joe, ele programador OO... no pode
ser muito difcil.

O que queremos.

Duck

quack()
swim()
display()
Joe
sses
y()

s ub c la O que Joe
Todasdaams fly().
// OUTROS mtodos parecidos com
duck adicionou.
her
ip o s d e Duck...
MallardDuck
RedheadDuck
Outros t
display() { display() {
// parece um pato bravo } // parece um cabea-vermelha }

2
Bem-Vindo aos Padres de Projetos

Mas alguma coisa deu muito errado...

Joe, estou na reunio com os


acionistas. Eles zeram uma
Ok, ento existe uma
demonstrao e havia patos de
pequena falha em meu
borracha voando pela tela. Isso
design. No sei por que
era a sua idia de uma brincadeira?
eles no podem chamar
Talvez voc queira passar algum
isso de um recurso. at
tempo com Monster.com...
bonitinho...

O que aconteceu?
Joe no percebeu que nem todas as subclasses de
O que ele pen-
Duck deveriam voar. Quando Joe adicionou um sou que fosse
novo comportamento superclasse Duck, tambm
estava adicionando um comportamento que no era
um excelente
apropriado para algumas subclasses Duck. Agora, uso da heran-
objetos inanimados estavam voando no programa
SimUPato.
a para ns de
reutilizao no
Uma atualizao localizada no cdigo causou um efeito
colateral no-local (patos de borracha voadores)! d to certo
quando se trata
de manuteno.

Duck

Ao colocarsfle,y(el)endaeu
quack()
swim()

superclas e de voar a
display()
y()

a capacidad patos, incluindo // OUTROS mtodos parecidos com

T ODOS os deveriam voar. duck

os que no

MallardDuck RedheadDuck RubberDuck


display() {
// parece um pato bravo }
display() { quack() { Patos de borracha
// parece um cabea-vermelha }
}
// substitudo por Squeak
no grasnam,
display() {
ento quack()
substitudo por
// parece um pato de borracha
}

Squeak.

3
Use a Cabea Padres de Projetos

Mas ento o que acontece

Joe pensa sobre herana... quando adicionamos patos


de madeira como isca ao
programa? Eles no devem
voar nem grasnar...
Eu poderia substituir
sempre o mtodo y()
em pato de borracha,
como fao com o
mtodo quack()...

RubberDuck

quack() { // squeak}
display() { .// rubber duck }
y() {
// substituir para fazer nada} DecoyDuck

quack() {
// substituir para fazer nada
}

Esta outra clarvsseequnae, assim


display() { // decoy duck}
y() {

hierarquia; obse k, ela no voa,


// substituir para fazer nada
}

como RubberDuco grasna.


mas tambm n
Aponte o seu lpis
Quais opes a seguir so desvantagens do uso de herana para produzir o comportamento Duck?
(Selecione todas as opes possveis.)

A. O cdigo duplicado entre as subclasses.

B. As alteraes no comportamento de tempo de execuo so difceis.

C. No podemos fazer patos danar.

D. difcil conhecer o comportamento de todos os patos.

E. Os patos no conseguem voar e grasnar ao mesmo tempo.

F. As alteraes podem afetar sem querer outros patos.

Que tal uma interface? Eu poderia tirar y() da


superclasse Duck e criar uma
Joe percebeu que a herana provavelmente no era a resposta por interface Flyable() com um
que ele recebeu o aviso de que os executivos agora querem atualizar o mtodo y(). Assim, somente
produto a cada seis meses (eles ainda no decidiram como). Joe sabe os patos que devem voar iro
implementar essa interface e ter
que as especicaes vo continuar mudando e que ele ser forado um mtodo y()... e tambm posso
a analisar e possivelmente substituir y() e quack() para cada nova criar uma Quackable, j que nem
subclasse Duck adicionada ao programa...sempre. todos os patos podem grasnar.

Por isso, ele precisa de uma maneira mais simples para que apenas
alguns (mas no todos) tipos de pato voem ou grasnem.

4
Bem-Vindo aos Padres de Projetos

Duck

swim()
Quackable display()
// OUTROS mtodos parecidos com
Flyable
quack() duck
y()

MallardDuck RedheadDuck RubberDuck DecoyDuck


display() display() display()
y() y() display()
quack()
quack() quack()

O que VOC acha deste projeto?


Esta a idia mais idiota que voc j teve.
Voc consegue dizer cdigo duplicado?
Se voc achava que ter que substituir alguns
mtodos era ruim, como ir se sentir quando
precisar fazer uma pequena alterao no
comportamento de vo... de todas as 48
subclasses de vo de Duck?!

O que voc faria se fosse Joe?


Sabemos que nem todas as subclasses devem ter o comportamento de
voar ou grasnar, ento a herana no a resposta certa. Mas, embora
fazer as subclasses implementar Flyable e/ou Quackable resolva parte do
problema (sem fazer patos de borracha voar inadequadamente), destri
completamente a reutilizao de cdigo para esses comportamentos,
criando apenas um pesadelo de manuteno diferente. E claro que
pode haver mais de um tipo de comportamento de vo at entre os
patos que voam...

Neste ponto, voc pode estar esperando que um Padro de Projetos


aparea em um cavalo branco e salve o dia. Mas qual seria a graa? No,
vamos encontrar uma soluo da maneira antiga aplicando princpios
de design de software OO adequados.

Você também pode gostar