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 conselhos 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 programadores. 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 signi!ca 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 intrepidamente 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 signi!cativamente 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 Princpio 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 pro!ssionais 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, de!nitivamente 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 signi!cado 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 cient!ca 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 melhorado 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 eletrnica.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 dias como designer de jogos (ela escreveu jogos para a Virgin, a MGM e a Amblin). Ela desenvolveu a maior parte do formato Use a Cabea" enquanto ensinava Autorao de Novas Mdias no programa de extenso Estudos de Entretenimento da UCLA. Mais recentemente, ela tem trabalhado como instrutora mster para a Sun Microsystems, ensinando aos instrutores Java da Sun sobre como ensinar as tecnologias Java mais recentes e desenvolvendo vrios dos exames de certi!cao da Sun. Junto com Bert Bates, ela tem usado ativamente os conceitos Use a Cabea! para ensinar a milhares de desenvolvedores. Kathy a fundadora do javaranch.com, que recebeu em 2003 e 2004 o prmio Jolt Cola Productivity Award, da revista Software Development. Tambm possvel encontr-la dando aulas de certi!cao Java no site Java Jam Geek Cruise (geekcruises.com). Recentemente se mudou da Califrnia para Boulder, Colorado, onde teve que aprender novas palavras, como limpador de gelo e pele, mas pelo menos l possvel esquiar. Gosta de: correr, esquiar, andar de skate, brincar com seu cavalo islands e de cincia esquisita. No gosta de: entropia. Um artigo de uma revista uma vez a descreveu como persuasiva. Ela ainda est tentando descobrir se eles disseram isso no bom sentido. Se voc souber, ou se tiver qualquer outro comentrio, escreva para ela (em ingls) em kathy@wickedlysmart.com.
VI

Bert desenvolvedor e arquiteto de software, mas uma passagem de dez anos no campo de inteligncia arti!cial leBert Bates vou-o a se interessar por Kathy Sierra teoria da apren-dizagem e pelo trei-namento baseado em tecnologia. Ele tem ensinado programao a clientes desde ento. Recentemente, tornou-se membro da equipe de desenvolvimento de vrios dos exames de Certi!cao Java da Sun, incluindo o novo SCBCD. Ele passou a primeira dcada da sua carreira em software viajando pelo mundo para ajudar clientes broadcast como a Rdio Nova Zelndia, o Weather Channel e a rede Arts & Entertainment (A & E). Um dos seus projetos favoritos foi a criao de um sistema completo de simulao de malha ferroviria para a Union Paci!c Railroad. Bert um jogador viciado de go de longa data e tem trabalhado em um programa de go por tempo demais. Ele um guitarrista razoavelmente bom e agora est tentando aprender banjo. Escreva para ele (em ingls) em terrapin@wickedlysmart.com.

Tabela de Contedo (sumrio)


Introduo 1 Bem-vindo aos Padres de Projetos: uma introduo 2 Mantendo os seus Objetos atualizados: o Padro Observer 3 Decorando Objetos: o Padro Decorator 4 Cozinhando com a polpa da programao OO: o Padro Factory 5 Objetos nicos: o Padro Singleton 6 Encapsulando a Chamada de Mtodos: o Padro Command 7 Como Ser Adaptvel: os padres Adapter e Facade 8 Encapsulando Algoritmos: o Padro Template Method 9 Colees bem administradas: os Padres Iterador e Composite 10 O Estado das Coisas: o Padro State 11 Controlando o Acesso de Objetos: o Padro Proxy 12 Padres de Padres: Padres Compostos 13 Padres no Mundo Real: Vivendo Melhor com os Padres 14 Apndice: Padres Restantes XV 1 27 57 79 125 143 177 205 235 289 325 373 435 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 certi!cando-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? Sabemos o que voc est pensando E sabemos o que o seu crebro est pensando Metacognio: pensando sobre o pensamento Eis o que VOC pode fazer para obrigar seu crebro a obedec-lo Revisores Tcnicos Agradecimentos XVI XVI XVI XVIII XIX XXII 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 polimor!smo 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 modi!car.
Comeou com um simples aplicativo SimUDuck Joe pensa sobre herana... Que tal uma interface? A constante no desenvolvimento de software Separando o que muda do que !ca igual Desenvolvendo os comportamentos de Duck Testando o cdigo Duck Con!gurando o comportamento de forma dinmica Uma viso geral dos comportamentos encapsulados TEM-UM pode ser melhor do que -UM E por falar em Padres de Projetos... O poder de um vocabulrio de padro compartilhado Como usar os Padres de Projetos? Ferramentas para sua caixa de ferramentas de projeto Soluo dos exerccios 2 4 4 6 7 8 13 14 16 17 18 21 21 23 26

VII

O Padro Observer

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 Conhea o Padro Observer Editora + Assinantes = Padro Observer Cinco minutos de teatro: um assunto para observao O Padro Observer de!nido O poder da Ligao Leve Desenvolvendo a Estao Meteorolgica Implementando a Estao Meteorolgica Usando o Padro Observer interno de Java Retrabalhando a Estao Meteorolgica no suporte interno Ferramentas para sua caixa de ferramentas de projeto Solues dos exerccios 28 32 32 35 36 38 40 40 45 48 52 55

O Padro Decorator

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 subclassi!cavam tudo. Isso at eu aprender o poder da extenso no tempo de execuo, em vez de no tempo de compilao. Olhe s para mim agora!
Bem-vindo ao Starbuzz Coffee O Princpio Aberto-Fechado Siga o Padro Decorator Construindo um pedido de bebida com Decoradores O Padro Decorator de!nido Decorando nossas bebidas Escrevendo o cdigo do Starbuzz Decoradores do mundo real: Java I/O Escrevendo seu prprio Decorador Java I/O Ferramentas para sua caixa de ferramentas de projeto Solues dos exerccios 58 63 64 64 65 66 69 73 74 76 77 Fundamentos OO Abstrao Encapsulamento Polimor smo ios OO Herana varia. e Princp u q le o u s posip a c En e com na. d a id r a D prio elao her e, r f m ter ac o e para in aes. e m a r ent Prog implem vemente a r a p no s le design que Busque ntre objetos e s 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 pblico 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 O que h de errado com o new Encapsulando a criao de objetos
VIII

80 81 82

Construindo uma fbrica simples de pizza O Simple Factory de!nido Franqueando a pizzaria Deixando as sub-classes decidirem Vamos criar uma PizzaStore Declarando um mtodo Factory Finalmente chegou a hora de conhecer o Padro Factory Method Outra perspectiva: hierarquias de classes paralelas Padro Factory Method de!nido Uma pizzaria muito dependente Analisando as dependncias dos objetos O Princpio da Inverso de Dependncia Enquanto isso, de volta PizzaStore... Famlias de ingredientes... Construindo as nossas fbricas de ingredientes Retrabalhando as Pizzas Padro Abstract Factory de!nido Comparao entre Factory Method e Abstract Factory Ferramenta para a sua Caixa de Ferramentas de Projetos Solues dos exerccios

83 85 86 87 89 90 95 95 97 99 100 100 104 105 105 108 113 116 118 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 implementao. Ento aperte o cinto este aqui no to simples quanto parece...
O Pequeno Singleton Dissecando a implementao clssica do Padro Singleton Entrvista desta semana: Con!sses de um Singleton A Fbrica Chocolate Padro Singleton de!nido
Hershey, PA

127 128 129 130 132 132 133 134 134 138 141

Huston temos um problema... Seja o JVM Lidando com vrios segmentos Podemos melhorar os vrios segmentos? Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios

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 Hardware grtis! Vamos examinar o Controle Remoto Examinando as classes de vendedor Enquanto isso, de volta ao Restaurante Uma breve introduo ao Padro Command Agora, vamos examinar mais detalhadamente a interao Papis e Responsabilidades no Restaurante Objetolndia Do Restaurante ao Padro Command Nosso primeiro objeto de comando 144 145 145 147 147 148 148 150 151

IX

De!nio do Padro Command De!nio do Padro Command: o diagrama de classes Implementando o Controle Remoto Testando o Controle Remoto E agora vamos conferir a execuo do nosso teste do controle remoto Chegou a hora de escrever aquela documentao Hora de testar aquele boto Refazer! Todo controle remoto precisa de um Modo de Festa! Usando um macrocomando Mais usos do Padro Command: en!leirando solicitaes Mais usos do Padro Command: registrando as solicitaes Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios

154 155 156 158 159 161 164 167 168 170 171 172 175
s s e te m u m a c la global fi q u e s e nto ri o p e V m u a n S in g le to instncia e forne uma apenas . la e so a de aces

Os Padres Adapter e Facade

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 simpli!car as suas interfaces.
Estamos cercados de adaptadores Adaptadores orientados a objetos Explicando o Padro Adapter De!nindo o Padro Adapter Adaptadores de objetos e de classes Adaptadores no mundo real Adaptando uma Enumerao a um Iterator E agora algo diferente... Todo Mundo Quer um Home Theater Luzes, Cmera e Fachada! Construindo a fachada do seu home theater De!nio do Padro Facade O Princpio do Conhecimento Mnimo Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios 178 178 182 183 184 187 187 190 191 193 194 196 197 201 203

Tomada de Parede Europia Adaptador para CA Pino Americano para CA

O Padro Template

8 Encapsulando Algoritmos
J encapsulamos a criao de objetos, mtodos, interfaces complexas, patos, pizzas... o que vir depois? Vamos encapsular 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) Senhor, posso abstrair seu Caf e seu Ch? Aprimorando o projeto Abstraindo prepareRecipe() O que ns !zemos? Conhea o Template Method Vamos fazer um pouco de ch O que o Template Method pode fazer por ns? De!nindo o Padro Template Method
X

206 208 209 209 212 212 213 214 214

Aproveitando o gancho do Template Method Usando o gancho Fazendo um test-drive O Princpio Hollywood O Princpio Hollywood e o Template Method Como Reconhecer um Template Method a Olho Nu Ordenando dados com o Template Method Temos alguns patos para ordenar Comparando Patos com Patos A construo da mquina de ordenar patos O Swing dos Quadros Applets No debate desta noite, Template Method e Strategy comparam mtodos Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios

216 217 218 220 220 222 222 223 224 226 227 228 229 232 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 pro!ssional. 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 Examinando os Itens do Menu Podemos encapsular a iterao? Conhea o Padro Iterato Incorporando o Iterador ao Menu do Restaurante Testando o nosso cdigo Aprimorando o processo com java.util.Iterator De!nindo o Padro Iterator Responsabilidade nica Examinando o Menu do Caf Iteradores e Colees Iteradores e Colees em Java 5 Justamente quando achvamos que estava pronto... De!nindo o Padro Composite Redesenhando os Menus com o Padro Composite Implementando o Componente de Menu Implementando o Item de Menu Voltando ao Iterator O Iterador Nulo A mgica de Iterator & Composite juntos... Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios 236 236 24 1 243 244 246 249 252 254 256 261 262 265 267 269 270 271 278 281 282 286 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 Curso elementar de mquinas de estado Escrevendo o cdigo Teste preliminar Voc j estava prevendo isto um pedido de modi!cao" 314 315 293 295 298

XI

O ESTADO confuso das coisas De!nindo as interfaces e classes Implementando as nossas classes de estados Refazendo a Mquina de Goma De!nindo o Padro State Strategy x State Quase esquecemos" Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios

299 301 302 303 310 316 317 320 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.
Codi!cando o Monitor O papel do proxy remoto Acrescentando um proxy remoto ... Curso bsico de mtodos remotos Vista Panormica do RMI de Java De!nindo o Padro Proxy Prepare-se para o Proxy Virtual Projetando o Virtual Proxy para capas de CD Como ImageProxy funcionar: Escrevendo ImageProxy Testando o Visualizador de Capas de CD O que ns !zemos? Usando o Proxy da API Java para criar um proxy de proteo Pea teatral em cinco minutos: a proteo dos objetos Vista Panormica: criando um Proxy Dinmico para PersonBean Primeiro passo: criando os Processadores de Chamadas O Zoolgico de Proxies Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios 326 328 330 330 333 348 349 350 350 351 353 354 357 359 360 361 366 368 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 sacri!c-lo se voc pegar a Febre dos Padres
Trabalhando juntos Reunio de patos O que ns !zemos? Viso panormica: o diagrama de classes O Rei dos Padres Compostos Conhecendo o Modelo-Visualizao-Controlador Examinando o MVC atravs de lentes coloridas por padres Usando o MVC para controlar a batida Conhea a Visualizao do Java DJ A Visualizao
XII

374 374 393 394 396 397 400 402 402 405

Frio Quente

E agora o Controlador Explorando Strategy Adaptando o Modelo Agora estamos prontos para o HeartController Coisas para fazer MVC e a Internet Padres de Projetos e Modelo 2 Ferramentas para sua caixa de ferramentas de projeto Solues dos Exerccios Padres de Projetos e o Modelo 2 Ferramentas para a sua Caixa de Ferramentas de Projetos Solues dos Exerccios

408 411 411 412 413 414 419 422 423 443 446 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 De!nindo o Padro de Projetos Examinando mais atentamente a de!nio do Padro de Projetos Que a fora esteja com voc No Existem Perguntas Idiotas Ento voc quer ser uma escritor de Padres de Projetos? Organizando Padres de Projetos Pensando em Padres Padres da Mente No se esquea do poder do vocabulrio compartilhado As cinco melhores maneiras de compartilhar o seu vocabulrio Rodando Objetolndia com a Gangue dos Quatro Sua jornada est s comeando Outras fontes de consulta sobre Padres de Projetos O Zoolgico de Padres Aniquilando o mal com os Anti-Padres Ferramentas para sua caixa de ferramentas de projeto Deixando Objetolndia Solues dos Exerccios 436 436 438 439 441 442 443 447 449 450 451 451 452 453 453 454 456 457 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) o!ciais 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 Use Use Use Use Use Use Use Use Use Use Use Use Use Use Use a a a a a a a a a a a a a a a a Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Cabea Java Anlise & Projeto Orientado a Objetos (A&POO) Ajax Iniciao Rpida HTML com CSS e XHTML Servlets e JSP PMP SQL Desenvolvimento de Software JavaScript C# PHP & MySQL (2009) Fsica (2009) Algebra (2009) Ajax Profissional (2009) Estatstica Ruby on Rails

XIV

Como usar este livro

Introduo

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

ta os perguEnel em d n po es r , o e s a t es N OR QU res P , o t n E : r la ca er qu que no isso em um livro sobre pad es colocaram os?. de projet

XV

Use a Cabea Padres de Projetos

A quem se destina este livro?


Se voc responder sim a todas estas perguntas:

Voc provavelmente se dar bem se souber C# 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 antropomor!zados possa ser srio? ento este livro no para voc.

keting: nota do departamento de mar qual a este livro adequado par o. quer um que 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?

E sabemos o que o seu crebro est pensando.

seu crebro acha que 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 inter!ram com verdadeiro trabalho do crebro registrar 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!


Mas imagine que voc esteja em casa, ou em uma biblioteca. uma rea segura, aconchegante e sem tigres. Voc est estudando. Preparando-se para um exame. Ou tentando aprender algum tpico tcnico difcil que 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 grande favor. Est tentando certi!car-se de que este contedo obviamente sem importncia no gaste recursos escassos. Recursos esses que seriam melhor gastos armazenando as coisas realmente importantes. Como tigres. Como o perigo do fogo. Como voc no deve nunca mais praticar esqui na neve de calo. 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.
timo. S faltam mais 490 pginas entediantes, secas e chatas.

acha ale o r b e r c seu IST O no v r. que na memoriza a pe

ender, depois certi!car? Primeiro voc tem que ent algo er end apr se e as a par rio tro da sua cabea. Conform Ento, o que necess a de empurrar fatos para den trat se er o N end er. apr uec o, esq ca vai edu se de que no e psicologia da cia cognitiva, neurobiologia cin re o. sob ebr es cr ent seu rec is ao a ma ress sas pesqui emos o que inte to em uma pgina. Ns sab exige muito mais do que tex

o um aprendiz. de Use a Cabea! com Ns pensamos no leitor

a!: aprendizado Use a Cabe Alguns dos princpios do nas ape que eis do

muito mais memorv Use o visual. As imagens so 89% de precisa chamar servio remoto izado muito mais efetivo (at end torna um m to do no RMI as palavras e tornam o apr bm Tam ia). nc servidor brana e transfer to melhoria em estudos de lem ou ue as palavras dentro per loq Co er. end ent de is fce doCalc() as coisas mais l ou em outra referem, em vez de no !na er olv dos gr!cos a que elas se res em uir seg con de os aprendizes valor de pgina, e a probabilidade retorno tedo poder dobrar. con ao s ado problemas relacion recentes, os estudos al e personalizado. Em estu Use um estilo conversacion no desempenho 40% at de ra dantes tiveram uma melho va quando o contedo fala em testes ps-aprendizado em al, ion sac ver con um estilo realmente uma droga ser di diretamente ao leitor, usando usar um tom formal. Conte se de um mtodo abstrato. No vez em , soa pes primeira pr se tem um corpo. as. Use Faz sentido dizer que a histrias em vez de dar aul hi Banheira -UM Banheiro? ea lev se o N . linguagem casual li Ou o Banheiro -UMA is ma ia star pre Banheira? Ou uma voc srio demais. Em que relao TEM-UM? um e ant dur te san res inte sa ateno: em uma conver jantar ou em uma aula? no do leitor. Todos j Consiga e mantenha a ate nte quero aprender lme rea tivemos a experincia eu da pgina um acordado. abstract void roam(); isto mas no consigo passar o em coisas que saiam do O seu crebro presta aten tes, estranhas, impressan 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 rpido se no for. is crebro aprender muito ma a sua capacidade de Ns sabemos, hoje em dia, que Envolva as emoes do leitor. se lembra das coisas Voc al. cion 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 ?, e da sensao de isso que iosidade, diverso, o cur sa, pre sur o com s e emo de -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 no sabe. aria do departamento de engenh sou mais tcnico do que vs
XVII

Use a Cabea Padres de Projetos

Metacognio: pensando sobre o pensamento


Se voc realmente deseja aprender, e quer aprender mais rpido e mais profundamente, preste ateno em como voc presta ateno. Pense sobre como voc pensa. Aprenda sobre como voc aprende. Muitos de ns no tivemos aulas sobre metacogni;o ou sobre teoria da aprendizagem 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.

Gostaria de saber como fazer o meu crebro se lembrar de tudo isto...

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 exaustiva. Voc obviamente sabe que capaz de aprender e memorizar at mesmo o assunto mais enfadonho, se se mantiver batendo na mesma tecla. Repetindo o su!ciente, 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 e!caz 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 codi!cado em mais de Objeto Cachorro uma rea do seu crebro. Usamos conceitos e imagens de formas inesperadas, porque o seu Objeto Subject crebro est ajustado para captar novidades, e usamos imagens e idias com pelo menos algum contedo emocional, porque o Objeto Pato Objeto Gato seu crebro est ajustado para prestar ateno na bioqumica das Atualizao/Noti!cao automtica emoes. Aquilo que o faz sentir algo tem maior probabilidade de ser lembrado, mesmo se o sentimento no passar de um pouco de Objeto Rato Observadores humor, surpresa ou interesse.
XVIII

objetos depe ndentes

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 desa!adores, porm solucionveis, porque isso que a maioria das pessoas prefere. Usamos mltiplos estilos de aprendizado, porque voc poderia preferir procedimentos passo-a-passo, O 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 bene!ciaro 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 signi!ca dar ao outro lado uma chance para descansar, voc pode ter maior produtividade no aprendizado 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 desa!os, com exerccios e fazendo perguntas que nem sempre tm uma resposta direta, 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 certi!carmos 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 projetos 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.
Quebra-cabeas Guru dos Padres

Pontos Importantes

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 partida; 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 precisa memorizar. No leia, apenas. Pare e pense. Quando o livro lhe !zer uma pergunta, no pule direto para a resposta. Imagine que algum est realmente fazendo lhe a pergunta. Quanto mais profundamente voc fora seu crebro a pensar, maior a sua chance de aprender e memorizar.

Beba gua. Muita gua. O seu crebro funciona melhor envolvido por bastante 'uido. A desidratao (que pode ocorrer antes de voc sequer sentir sede) diminui a capacidade cognitiva. 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 se lembrar do assunto depois, pronuncie-o em voz alta. Melhor ainda, tente explic-lo em voz alta para algum. Voc aprender mais rapidamente e poder descobrir idias que voc nem suspeitava que estavam l antes de comear a ler. Oua o seu crebro. Preste ateno se o seu crebro est !cando sobrecarregado. Se voc se pegar comeando a ler super!cialmente ou esquecendo o que acabou de ler, hora de fazer uma pausa. Depois de passar de um certo ponto, voc no vai aprender mais rpido tentando inserir mais informaes e poder at prejudicar o processo. Sinta algo! O seu crebro precisa saber que isto importante. Envolva-se com as estrias. Crie as suas prprias legendas para as fotos. Resmungar sobre uma piada ruim ainda melhor do que no sentir nada. 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 bene!ciar de um ou mais padres de projetos.
Usamos um pseudo-UML modi!cado mais simples

Faa os exerccios. Escreva as suas prprias notas. Ns os inclumos, mas, se os resolvssemos para voc, seria como ter algum fazendo os seus abdominais para voc. E no olhe os exerccios simplesmente. Use um lpis. H muita evidncia de que atividade fsica durante o aprendizado pode melhor-lo. Leia as sees Perguntar no ofende/No existem perguntas idiotas. Isso signi!ca todas elas. Elas no so enfeites opcionais fazem parte do contedo central! No as pule. Faa deste livro a sua ltima leitura antes de dormir. Ou pelo menos a ltima leitura desa!adora. Parte do aprendizado (especialmente a transferncia para a memria de longo prazo) acontece depois que voc fecha o livro. O seu crebro precisa tirar um tempo para fazer mais processamentos. Se voc acrescentar algo durante esse tempo de processamento, parte do que voc acabou de aprender se perder.

Leia-me

Isto uma experincia de aprendizagem, no um livro de referncia. Ns deliberadamente 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 tentemos 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 certi!carmos 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 certi!carmos 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 re'ete o uso tradicional do termo e o mesmo empregado no texto GoF (voc aprender o que isso mais tarde). Mais recentemente, a UML re!nou 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 re!nados, 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 precisam 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 especi!camente 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 programador 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

Jef Cumps

Valentin Crettaz Barney Marispini

Ike Van Attaa O destemido lder da Equipe Radical dos Revisores do UCPP Jason Menard

Johannes de Jong

Mark Spritzler

Dirk Schreckmann

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 apreciamos 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 javaranch.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 con!ar 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 levou 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 caloroso. 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 aprendidas 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 nadam, a superclasse cuida do cdigo de implementao.


e el po ds i t b v u s n r Cadao respon pat impleme ta poru prprio nto se portame a o modo com play() par e na tela. dis o aparec com

Duck quack() swim() display() // OUTROS mtodos parecidos com duck...

MallardDuck display() { // parece um pato bravo }

RedheadDuck display() { // parece um cabea-vermelha }

O mtodo display() abstrato j que todos os subtipos de pato so diferentes. to a p e d s o p i . os tD r t u o s o t da classe uck Muid her am

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.

Mas agora precisamos dos patos para VOAR


Os executivos decidiram que fazer os patos voarem o que o simulador para acabar com a concorrncia. E claro que o gerente de Joe disse a eles que Joe poderia criar algo em uma semana. A!nal, disse o chefe de Joe, ele programador OO... no pode ser muito difcil.

S preciso adicionar um mtodo !y() classe Duck e depois todos os patos iro herd-lo. a hora de eu mostrar que sou mesmo um gnio OO.

O que queremos.
Duck quack() swim() display() !y() // OUTROS mtodos parecidos com duck

sses a l c b u s as ly(). Todas f herdam


MallardDuck

O que Joe adicionou.

Joe

RedheadDuck
display() { // parece um cabea-vermelha }

Duck... e d s o p i Outros t

display() { // parece um pato bravo }

Bem-Vindo aos Padres de Projetos

Mas alguma coisa deu muito errado...

Joe, estou na reunio com os acionistas. Eles "zeram uma demonstrao e havia patos de borracha voando pela tela. Isso era a sua idia de uma brincadeira? Talvez voc queira passar algum tempo com Monster.com...

Ok, ento existe uma pequena falha em meu design. No sei por que eles no podem chamar isso de um recurso. at bonitinho...

O que aconteceu?
Joe no percebeu que nem todas as subclasses de Duck deveriam voar. Quando Joe adicionou um novo comportamento superclasse Duck, tambm estava adicionando um comportamento que no era apropriado para algumas subclasses Duck. Agora, objetos inanimados estavam voando no programa SimUPato. Uma atualizao localizada no cdigo causou um efeito colateral no-local (patos de borracha voadores)!

O que ele pensou que fosse um excelente uso da herana para !ns de reutilizao no d to certo quando se trata de manuteno.

Duck

y() na Ao colocarsfl ele deu superclas e, de voar a uindo a capacidadepa tos, incl r. T ODOS os dev os que no eriam voa
MallardDuck display() { // parece um pato bravo }

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

RedheadDuck display() { // parece um cabea-vermelha }

RubberDuck quack() { // substitudo por Squeak } display() { // parece um pato de borracha }

Patos de borracha no grasnam, ento quack() substitudo por Squeak.

Use a Cabea Padres de Projetos

Joe pensa sobre herana...


Eu poderia substituir sempre o mtodo !y() em pato de borracha, como fao com o mtodo quack()...

Mas ento o que acontece quando adicionamos patos de madeira como isca ao programa? Eles no devem voar nem grasnar...

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

DecoyDuck quack() { // substituir para fazer nada } display() { // decoy duck} y() { // substituir para fazer nada }

sse na Esta outra clarv que, assim hierarquia; obse k, eela no voa, 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?


Joe percebeu que a herana provavelmente no era a resposta por que ele recebeu o aviso de que os executivos agora querem atualizar o produto a cada seis meses (eles ainda no decidiram como). Joe sabe que as especi!caes vo continuar mudando e que ele ser forado a analisar e possivelmente substituir "y() e quack() para cada nova subclasse Duck adicionada ao programa...sempre. Por isso, ele precisa de uma maneira mais simples para que apenas alguns (mas no todos) tipos de pato voem ou grasnem.

Eu poderia tirar !y() da superclasse Duck e criar uma interface Flyable() com um mtodo !y(). Assim, somente os patos que devem voar iro implementar essa interface e ter um mtodo !y()... e tambm posso criar uma Quackable, j que nem todos os patos podem grasnar.

Bem-Vindo aos Padres de Projetos

Duck swim() display() // OUTROS mtodos parecidos com duck

Quackable Flyable !y() quack()

MallardDuck display() y() quack()

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

RubberDuck display()

DecoyDuck

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.