Vous êtes sur la page 1sur 52

Curso - Padres de Projeto

Mdulo 1: Introduo
Vtor E. Silva Souza
vitorsouza@gmail.com
http://www.javablogs.com.br/page/engenho
http://esjug.dev.java.net

Sobre o Instrutor

Formao:

Java:

Graduao em Cincia da Computao, com nfase em


Engenharia de Software, pela Universidade Federal do
Esprito Santo (UFES);
Mestrado em Informtica (em andamento) na mesma
instituio.
Desenvolvedor Java desde 1999;
Especialista em desenvolvimento Web;
Autor do blog Engenho www.javablogs.com.br/page/engenho.

Profissional:

Consultor em Desenvolvimento de Software Orientado a


Objetos Engenho de Software Consultoria e
Desenvolvimento Ltda.
2

Estrutura do Curso
Mdulo 1

Introduo

Mdulo 2

Padres de Criao

Mdulo 3

Padres de Estrutura

Mdulo 4

Padres de Comportamento

Mdulo 5

O Padro Model-View-Controller

Contedo deste mdulo

O que so e por que conhec-los;


Catlogos de padres;
Padres de projeto na prtica:

Como resolvem os problemas;


Como escolher e utilizar;
Frameworks.

Anti-padres.
4

Curso - Padres de Projeto


Mdulo 1: Introduo
O que so Padres de Projeto
e por que utiliz-los?

Desenvolvimento de Software

Desenvolver sistemas OO reutilizveis


muito difcil;
Profissionais experientes fazem bons
projetos, novatos tm dificuldade;
Experincia consiste em utilizar
tcnicas que deram certo no passado.

Nascem os padres

Padres so maneiras testadas e


documentadas de alcanar objetivos;
Padres so comuns nas diversas
reas da engenharia;
Na Engenharia de Software temos os
Padres de Projeto Design Patterns.

O que so padres de projeto


Cada padro descreve um problema que
ocorre repetidas vezes no nosso ambiente e,
ento, descreve o ncleo da soluo para
aquele problema, de forma que voc pode
reutilizar a mesma soluo milhes de vezes
sem nunca faz-la da mesma forma duas
vezes.
Christopher Alexander, et. al
A Pattern Language (1977)
8

O que so padres de projeto


Descrio de uma soluo customizada para
resolver um problema genrico de projeto em
um contexto especfico. [...] Um padro de
projeto d nome, abstrai e identifica os
aspectos-chave de uma estrutura de projeto
comum para torn-la reutilizvel.
Erich Gamma, et. al
Design Patterns, Elements of Reusable
Object-Oriented Software (1994)
9

Como formado um padro

Quatro elementos essenciais:

Nome;
Descrio do problema e contexto para
os quais o padro se aplica;
Descrio da soluo genrica proposta;
Consequncias da aplicao do padro
(custos e benefcios).

10

Por que usar padres

Aprender com a experincia de outros:

Ajudam a resolver os principais


problemas dos iniciantes;
Permitem que faamos bons projetos
mais rapidamente.

O jargo facilita a comunicao;


Software de melhor qualidade:

Melhores prticas em OO;


Solues bem testadas e documentadas.

11

Curso - Padres de Projeto


Mdulo 1: Introduo
Catlogos de Padres de
Projeto: classificao e
resumo dos padres mais
conhecidos.

Catlogos de padres

Registram as experincias bemsucedidas de um grupo de pessoas:

Livro Design Patterns

Erich Gamma, Richard Helm,


Ralph Johnson, John Vlissides
(Gang of Four);

Padres J2EE da Sun

http://java.sun.com/blueprints
/patterns/

Dentre outros...
13

Descrio dos padres do GoF

Nome e
classificao;
Inteno;
Outros nomes;
Motivao;
Aplicabilidade;
Estrutura;
Participantes;

Colaboraes;
Consequncias;
Implementao;
Cdigo de exemplo;
Usos conhecidos;
Padres
relacionados.

14

Organizao do catlogo do GoF


Propsito

Escopo

Classe

Objeto

Criao

Estrutura

Comportamento

Factory Method

Adapter (classe)

Interpreter
Template Method

Abstract Factory Adapter (objeto) Chain of Responsibility


Builder
Bridge
Command
Prototype
Composite
Iterator
Singleton
Decorator
Mediator
Faade
Memento
Flyweight
Observer
Proxy
State
Strategy
Visitor
15

Organizao do catlogo do GoF

Propsito:

Criacional: processo de criao de objetos;


Estrutural: composio de classes e objetos;
Comportamental: interao e distribuio de
responsabilidades entre objetos e classes;

Escopo:

Classe: relao entre classes e subclasses


(herana);
Objeto: relao entre objetos (associao,
composio).
16

Padres de Criao

Factory Method (Mtodo Fbrica):

Abstract Factory (Fbrica Abstrata):

Define uma interface para criao de objetos


mas deixa a implementao para as subclasses.
Prov uma interface para criao de famlias de
objetos relacionados sem especificar suas
classes concretas.

Builder (Construtor):

Separa o processo de construo de objetos


complexos, desacoplando a criao de instncias
destes objetos.

17

Padres de Criao

Prototype (Prottipo):

Define um prottipo dos objetos a serem


usados e cria-os clonando este prottipo.

Singleton (Objeto nico):

Garante que uma classe possui somente


uma instncia e prov um ponto de
acesso global a ela.

18

Padres de Estrutura

Adapter (Adaptador):

Bridge (Ponte):

Converte uma interface de uma classe em outra


que objetos clientes esperam utilizar.
Desacopla uma abstrao de sua implementao
para que ambas possam variar
independentemente.

Composite (Composto):

Agrupa objetos de mesma interface em


estrutura de rvore para tratar todos eles como
se fossem uma nica entidade.

19

Padres de Estrutura

Decorator (Decorador):

Estende a funcionalidade de um objeto


dinamicamente anexando objetos que
iro executar antes ou depois do objeto
decorado.

Faade (Fachada):

Prov uma interface nica (ponto central)


para diversas outras interfaces do
sistema.
20

Padres de Estrutura

Flyweight (Peso Mosca):

Forma um pool de objetos imutveis para


serem utilizados em diversas partes do
sistema.

Proxy (Procurador):

Prov um intermedirio (procurador) que


representa o objeto mas se comporta de
forma diferente.
21

Padres de Comportamento

Interpreter (Interpretador):

Template Method (Mtodo Modelo):

Criar uma linguagem de representao de


operaes e construir um interpretador para
essa linguagem.
Define o esqueleto do algortmo da operao na
superclasse, delegando partes do mesmo para
as subclasses.

Chain of Responsibility (Cadeia de Repons.):

Monta uma corrente de objetos que serve a uma


requisio, dando a cada um a oportunidade de
respond-la e/ou pass-la adiante.
22

Padres de Comportamento

Command (Comando):

Iterator (Iterador):

Encapsula requisies como objetos, permitindo


parametrizao, log ou undo de funes.
Acessar diversos elementos de um conjunto em
sequncia sem expor sua representao interna.

Mediator (Mediador):

Delega a um objeto a responsabilidade de fazer


outros objetos se comunicarem, tirando destes
ltimos o acoplamento entre si.
23

Padres de Comportamento

Memento (Recordao):

Observer (Observador):

Sem violar o encapsulamento, armazena o


estado atual do objeto para que possa ser
restaurado posteriormente.
Define uma dependncia um-para-muitos entre
objetos tal que quando um objeto muda de
estado, todos so notificados.

State (Estado):

Permite que um objeto altere seu


comportamente quando mudar seu estado.

24

Padres de Comportamento

Strategy (Estratgia):

Define uma famlia de algortmos,


encapsula-os em objetos e permite que
sejam intercambiados.

Visitor (Visitante):

Representa operaes em objetos como


outros objetos com uma interface
comum, permitindo que sejam criadas
novas operaes sem alterar o objeto.
25

Relacionamento entre
os Padres

Consulte o livro do GoF


para mais detalhes.
26

Outros padres

GoF a referncia clssica;


Novos problemas incitam a criao de
novos padres de projeto;

Muitos utilizam ou so baseados nos


padres j descritos no catlogo do GoF.

importante conhec-los porque se


referem a domnios mais especficos:

Ex.: um desenvolvedor J2EE deve


conhecer os padres de projeto J2EE.
27

Outros padres exemplos:

Injeo de Dependncias (ou IoC):

Tira a responsabilidade do objeto


encontrar sua dependncia, que
automaticamente injetada por um objeto
externo.

Model View Controller:

Utiliza Observer, Composite e Strategy


para definir uma diviso entre dados
(modelo), interface com o usurio (viso)
e a lgica de controle.
28

Outros padres exemplos:

Value Object (VO / DTO):

Cria uma cpia do objeto de domnio com


algumas informaes necessrias e enviaa como parmetro no lugar do objeto
original.

Data Access Object (DAO):

Delega a uma classe especfica toda a


lgica de acesso a dados persistentes
(banco de dados).
29

Curso - Padres de Projeto


Mdulo 1: Introduo
Padres de Projeto na Prtica:
como os padres resolvem
problemas, como selecionlos e utiliz-los.

Determinando os objetos mais


apropriados

Decompor um sistema em objetos


difcil. Vrias questes:

Encapsulamento, granularidade,
dependncias, flexibilidade, desempenho,
evoluo, reusabilidade, etc.

Padres de projeto podem ajudar:

Identificao de abstraes menos bvias


de conceitos no presentes na natureza,
como um algortmo ou um estado.
31

Determinando a granularidade
ideal

Um objeto pode representar uma aplicao


inteira ou um detalhe minsculo. Como
escolher?
Padres de projeto podem ajudar:

Faade explica como representar sistemas


inteiros num s objeto;
Flyweight descreve como utilizar muitos objetos
de pequena granularidade;
Abstract Factory, Builder, Visitor e Command
descrevem formas especficas de composio de
objetos.

32

Especificando interfaces

Interfaces:

Conjunto de mensagens que um objeto


aceita (contrato, assinaturas);
Objetos so conhecidos pelas interfaces,
que nada dizem sobre a implementao.

Padres de projeto podem ajudar:

Identificam os elementos-chave de
interfaces;
Restringem o que incluir em interfaces;
Estabelecem relacionamentos entre elas.
33

Especificando implementaes

Boa prtica: programe para


interfaces, no para implementaes;
Padres de projeto podem ajudar:

Abstraem o processo de criao de


objetos, desacoplando os objetos clientes
de implementaes, permanecendo
somente as interfaces.

34

Tirando proveito do reuso

Como construir software reutilizvel?

D preferncia composio de objetos


em detrimento herana de classes.

Padres de projeto podem ajudar:

Delegao d mais poder composio.

35

Relacionando estruturas em tempo


de compilao e execuo

A estrutura runtime bem diferente


do cdigo: dinamismo e interao;

Ex.: agregao e associao so


codificadas da mesma forma, mas so
bem diferentes em runtime.

Padres de projeto podem ajudar:

Se voc entende o padro, passa a


entender a distino, que est explcita
na documentao do padro.
36

Projetando para mudanas

Sistemas devem ser projetados para


facilitarem a manuteno:

Riscos de custos imprevistos;


Retrabalho.

Padres de projeto podem ajudar:

Promovem desacoplamento, permitindo


maior liberdade dos objetos;
Cdigo mais robusto, legvel e de maior
qualidade.
37

Causas de retrabalho e padres


(GoF) que as evitam
1. Criao de objeto especifica classe

explicitamente:

O sistema est preso a uma implementao


especfica;
Soluo: criar objetos indiretamente com
Abstract Factory, Factory Method ou Prototype.

2. Dependncia em operaes especficas:


O sistema s tem uma forma de satisfazer a uma
requisio;
Soluo: evitar requisies hard-coded com
Chain of Responsibility ou Command.

38

Causas de retrabalho e padres


(GoF) que as evitam
1. Dependncia de plataforma:
O software utiliza recursos especficos de uma
plataforma;
Soluo: limitar dependncias com Abstract
Factory ou Bridge.
2. Dependncia em representaes ou

implementaes de objetos:

Clientes que sabem como um objeto


implementado, representado ou armazenado
podem ter que ser alterados se o objeto
mudar;
Soluo: isolar os clientes com Abstract
Factory, Bridge, Memento ou Proxy.

39

Causas de retrabalho e padres


(GoF) que as evitam
1. Dependncia de algortmo:
Objetos que dependem de algortmos precisam
mudar quando o algortmo mudar;
Soluo: isolar os algortmos com Builder,
Iterator, Strategy, Template Method ou Visitor.
2. Forte acoplamento:
Classes fortemente acopladas so difceis de
reusar, testar, manter, etc. Sistema monoltico;
Soluo: enfraquecer o acoplamento com
Abstract Factory, Bridge, Command, Chain of
Responsibility, Faade, Mediator ou Observer.
40

Causas de retrabalho e padres


(GoF) que as evitam
1. Extenso de funcionalidade por meio de

subclasse:

Herana difcil de usar, composio dificulta a


compreenso;
Soluo: usar padres que implementem bem
herana, composio e delegao como Bridge,
Chain of Responsibility, Composite, Decorator,
Observer ou Strategy.

2. Incapacidade de alterar classes

convenientemente:

Classes inacessveis, imcompreensveis ou


difceis de alterar;
Soluo: usar Adapter, Decorator ou Visitor.
41

Como selecionar um padro

Entenda como os padres ajudam a resolver


problemas em OO;
Revise as intenes de cada padro;
Estude como os padres se interrelacionam;
Estude as similaridades entre os padres de
mesmo propsito;
Conhea as principais causas de retrabalho;
Considere o que voc pode querer mudar
em seu projeto no futuro.
42

Resumo do Catlogo do GoF

Padres de Criao

Padro

Aspectos que podem variar

Abstract Factory

Famlias de objetos produto.

Builder

Como um objeto composto criado.

Factory Method

Subclasse do objeto que instanciado.

Prototype

Classe do objeto que instanciado

Singleton

Uma nica instncia da classe.


43

Padres de Estrutura

Resumo do Catlogo do GoF


Padro
Adapter

Aspectos que podem variar


Inteface para um objeto.

Bridge

Implementao de um objeto.

Composite

Estrutura e composio de um objeto.

Decorator
Faade

Responsabilidades de um objeto sem


recorrer herana.
Interface para um subsistema.

Flyweight

Custo de armazenamento de objetos.

Proxy

Como um objeto acessado, sua


localizao.

44

Padres de Comportamento

Resumo do Catlogo do GoF


Padro
Chain of
Responsibility
Command
Interpreter
Iterator
Mediator

Aspectos que podem variar


Objeto que pode responder a uma
requisio.
Onde e como uma requisio
respondida.
Gramtica e interpretao de uma
linguagem.
Como elementos agregados so
acessados.
Como e quais objetos interagem uns
com os outros.
45

Padres de Comportamento

Resumo do Catlogo do GoF


Padro
Memento

State

Aspectos que podem variar


Quais informaes privadas so
armazenadas fora do objeto e quando.
Nmero de objetos que dependem de
outro e como estes ficam atualizados.
Estados de um objeto.

Strategy

Um algoritmo.

Observer

Template Method Passos de um algoritmo.


Visitor

Operaes que podem ser aplicadas a


objetos sem alterar suas classes.

46

Como usar um padro


1. Leia o padro todo uma vez;
2. Estude o cdigo fonte de exemplo;
3. Escolha nomes para os participantes

do padro dentro do seu contexto;


4. Defina as novas classes e modifique
classes existentes que so afetadas;
5. Defina nomes para as operaes do
padro dentro do seu contexto;
6. Implemente as operaes.

47

Curso - Padres de Projeto


Mdulo 1: Introduo
Anti-Padres: solues que
voc deve evitar.

O que um anti-padro

Antipatterns so solues que trazem


mais complicao do que benefcio;
Pode advir de:

Uso incorreto de padres de projeto;


Criao de um novo padro sem as
devidas reflexes e testes;
O que era bom ontem pode no ser mais.

necessrio entend-los para no cair


em armadilhas e, se cair, saber se
recuperar delas.

49

Exemplos de anti-padres

Analysis paralysis;
Stovepipe system;
Design by committee;
Copy and paste programming;
Spaghetti code;
God object/class;
Vendor lock-in;
E muitos outros...

50

Para saber mais...

Neste curso iremos focar nos padres


de projeto, e no nos anti-padres;
Para saber mais:

Wikipedia
http://en.wikipedia.org/wiki/Antipattern
Antipatterns.com:
http://www.antipatterns.com/

51

Curso - Padres de Projeto


Mdulo 1: Introduo
Vtor E. Silva Souza
vitorsouza@gmail.com
http://www.javablogs.com.br/page/engenho
http://esjug.dev.java.net