Beruflich Dokumente
Kultur Dokumente
Padres de Projeto
Licena
O uso deste material est condicionado licena Creative Commons AttributionNonCommercial-Share Alike 3.0 Brazil, que pode ser obtida mediante o acesso ao endereo
http://creativecommons.org/licenses/by-nc-sa/3.0/br/.
ii
Padres de Projeto
Apresentao
Muito se discute quanto utilizao dos padres de projeto. Alguns
argumentam que a proliferao de classes acaba por inchar o cdigo da
aplicao. Outros, no entanto, atestam que os padres de projeto fazem parte
das assim chamadas boas prticas e que seu uso proporciona maior clareza
no cdigo, traz facilidades de manuteno, promove a separao de
atribuies e garante extensibilidade medida que novas funcionalidades so
agregadas ao sistema.
iii
Padres de Projeto
iv
Padres de Projeto
Criao
Escopo
Propsito
Estrutural
Comportamental
Interpreter
Classe Factory Method Adapter (classe)
Template Method
Chain of Responsibility
Adapter (objeto) Command
Bridge
Iterator
Abstract Factory
Composite
Mediator
Builder
Objeto
Decorator
Memento
Prototype
Faade
Observer
Singleton
Flyweight
State
Proxy
Strategy
Visitor
Padres de Projeto
Nome e Classificao
Inteno
Conhecido como
Motivao
Aplicabilidade
Estrutura
Participantes
Colaboraes
Conseqncias
Implementao
Exemplo
Usos Conhecidos
Padres Relacionados
Quadro 1: Estrutura para descrio dos padroes de projeto utilizada no Catlogo GoF.
vi
Padres de Projeto
vii
Padres de Projeto
SUMRIO
Introduo ......................................................................................................... 9
Singleton Criao ........................................................................................ 12
Factory Method Criao.............................................................................. 17
Abstract Factory Criao ............................................................................ 22
Command Comportamento ........................................................................ 26
Chain of Responsibility Comportamento .................................................. 30
Observer Comportamento .......................................................................... 33
Adapter Estrutura ........................................................................................ 37
Faade Estrutura ......................................................................................... 40
Prototype Criao ....................................................................................... 43
Decorator Estrutura .................................................................................... 46
Builder Criao ............................................................................................ 50
Template Method Comportamento ............................................................ 53
Iterator Comportamento ............................................................................. 56
Composite Estrutura ................................................................................... 59
State Comportamento ................................................................................. 63
Strategy Comportamento ........................................................................... 65
Proxy Estrutura ........................................................................................... 68
Visitor Comportamento............................................................................... 71
Memento Comportamento .......................................................................... 74
Mediator Comportamento ........................................................................... 77
Bridge Estrutura .......................................................................................... 80
Flyweight Estrutura ..................................................................................... 83
Interpreter Comportamento ........................................................................ 86
REFERNCIAS................................................................................................ 89
viii
Padres de Projeto
Introduo
O Projeto Orientado a Objetos enfatiza na definio de objetos de
software e em como eles colaboram entre si. Esta colaborao depende de
como os objetos necessitam saber sobre questes internas uns dos outros.
Padres de Projeto
contento.
Se
uma
classe
possui
comportamentos
no
10
Padres de Projeto
11
Padres de Projeto
Singleton Criao
Apresentao
Este padro garante que haja somente uma instncia para uma classe e,
assim, fornece um ponto nico de acesso a ela.
Aplicabilidade
Grupos (pools) de objetos para o gerenciamento de threads e conexes
com bases de dados; caixas de dilogo; configuraes de preferncias e de
registros; objetos para logging e objetos que agem como drivers para
dispositivos, tais como impressoras e placas grficas.
Estrutura
Descrio
Para que no haja a possibilidade de criao de objetos arbitrrios o
construtor declarado como private. A varivel esttica instance
utilizada para armazenar uma instncia da classe Singleton. Como o
construtor da classe privado, o nico ponto de entrada para a obteno de
uma
referncia
para
classe
Singleton
atravs
do
mtodo
12
Padres de Projeto
Exemplo de Cdigo
Observaes
Algumas caractersticas deste padro de projeto merecem ateno
especial. Devido ao fato de usar um construtor privado, o conceito de
polimorfismo torna-se limitado. Outro ponto importante diz respeito a
aplicaes com mltiplas threads. Neste caso, o mtodo getInstance()
deve ser escrito de tal forma que vrias threads concorrendo por ele possam
aguardar o momento correto para acess-lo. Assim, sua assinatura passa a
ser:
13
Padres de Projeto
14
Padres de Projeto
15
Padres de Projeto
Padres Relacionados
Abstract Factory, Builder e Prototype.
Anti-Pattern
O anti-pattern do padro Singleton diz respeito ao fato de haver duas ou
mais instncias da classe em questo, uma para cada classe que queira
acessar suas informaes, o que acabaria levando a um aumento na criao
de objetos e na sua conseqente remoo pelo coletor de lixo (garbage
collector), quando for o caso.
16
Padres de Projeto
17
Padres de Projeto
Aplicabilidade
A maioria dos frameworks faz uso deste padro possibilitando que uma
poro de cdigo existente seja genrica o suficiente para satisfazer alguns
requisitos e deixando por conta do desenvolver o cdigo especfico,
implementado a partir da base do framework, que v de encontro aos requisitos
para uma dada aplicao.
Estrutura
Descrio
A interface Creator contm, alm de outros, o mtodo factory. Este
mtodo deve ser codificado pelas classes concretas que implementam, no caso
de interface, ou herdam, no caso de classe abstrata, da classe Creator.
18
Padres de Projeto
Exemplo de Cdigo
19
Padres de Projeto
20
Padres de Projeto
iterator()
das
classes
descendentes
da
interface
Padres Relacionados
Abstract Factory, Template Method e Prototype.
Anti-Pattern
Para este padro, o anti-pattern apresenta um forte acoplamento entre o
aplicativo e as vrias classes que descrevem os produtos a serem criados,
pois haver uma referncia para cada ConcretProduct. Isto implica que
modificaes futuras podem acrescentar bugs ao cdigo j existente e testado.
21
Padres de Projeto
Aplicabilidade
Quando se deseja criar famlias de objetos (produtos) relacionados ou
que possuam algum tipo de dependncia entre si. Um conjunto de
componentes para a interface grfica com usurio um bom exemplo. Cada
sistema operacional possui um sistema grfico diferente, como, por exemplo,
Windows GDI, Motif, GTK+ e Qt, entre outros. O mesmo acontece com drivers
para mouse, placas de vdeo e impressoras. Para cada sistema operacional a
aplicao pode selecionar o conjunto de drivers de acordo com a plataforma na
qual est em execuo.
Estrutura
22
Padres de Projeto
Descrio
AbstractFactory define a interface que todas as fbricas concretas
(ConcreteFactory1, ConcreteFactory2) devem implementar. As fbricas
concretas implementam diferentes famlias de produtos (AbstractProductA,
AbstractProductB). Desta forma, a classe que representa um "produto",
propriamente dita, jamais tem que ser instanciada.
Exemplo de Cdigo
23
Padres de Projeto
Observaes
Padres Relacionados
Factory Method, Prototype e Singleton.
24
Padres de Projeto
Anti-Pattern
O anti-pattern para o padro de projeto Abstract Factory assemelha-se
ao do padro Factory Method, pois a aplicao manteria um forte acoplamento
com as classes concretas, Leao e Lobo, por exemplo, o que tornaria sua
manuteno muito difcil.
25
Padres de Projeto
Command Comportamento
Descrio
Este padro de projeto representa comandos como objetos. Isto
possibilita realizar requisies a objetos sem o conhecimento de como a
operao executada ou o destinatrio (receiver) da requisio.
Aplicabilidade
Objetos podem ser parametrizados pela ao a executar, como, por
exemplo, uma opo de menu ou um boto em uma barra de ferramentas.
Opcionalmente, um comando pode especificar uma operao de desfazer
(undo), permitindo reverter os efeitos no prprio comando. Assim, a interface
Command deve declarar uma operao (mtodo) undo() para realizar tal
operao. Neste caso, as aes realizadas por execute() so armazenadas
em uma lista de histrico e o nvel de execues e reverses pode ser ilimitado
simplesmente percorrendo a lista de histrico do fim para o incio ou do incio
para fim.
Estrutura
26
Padres de Projeto
Descrio
A classe Aplicao cria um comando concreto e configura o receiver
para que este possa execut-lo. A classe Receiver, que pode ser qualquer
classe
na
aplicao,
sabe
como
executar
trabalho
necessrio.
Exemplo de Cdigo
27
Padres de Projeto
Observaes
Classes Command desacoplam objetos que invocam operao daqueles
que a executam. Alm disto, utilizando o padro de projeto Composite,
possvel criar conjuntos compostos de comandos que so executados em
seqncia.
Padres Relacionados
Composite, Memento e Prototype.
Anti-Pattern
Separar os comandos a serem executados em classes distintas
mediante uma interface comum tido como uma boa prtica em projetos de
software. Classes que implementam mtodos para realizarem suas tarefas
28
Padres de Projeto
29
Padres de Projeto
Aplicabilidade
Este padro de projeto comumente utilizando quando mais de um
objeto capaz de tratar um pedido e o mesmo no conhecido
antecipadamente. O objeto tratador do pedido deve ser reconhecido
automaticamente.
Um pedido deve ser tratado por um entre vrios objetos sem que o
objeto tratador seja especificado explicitamente.
Estrutura
Descrio
Cada
objeto
no
encadeamento
(ConcreteHandlerA,
30
Padres de Projeto
Exemplo de Cdigo
31
Padres de Projeto
Observaes
O projeto Apache Commons disponibiliza, entre outros, um framework,
denominado
Commons
Chain
(http://commons.apache.org/chain/),
que
Padres Relacionados
Composite.
Anti-Pattern
Dado um conjunto de servios, como, por exemplo, validao de dados,
log e filtro de dados e segurana, que devem ser executados por um grupo de
operaes (processamentos), como, por exemplo, um sistema de venda na
qual cada etapa de sua realizao constitui-se em uma operao, cada
processamento estaria acoplado a todos os servios e estes seriam totalmente
dependentes das vrias etapas do processamento do pedido (realizao de um
venda).
32
Padres de Projeto
Observer Comportamento
Apresentao
O objetivo deste padro de projeto definir uma relao de dependncia
de um para muitos entre um conjunto de objetos. Desta forma, quando um
objeto muda de estado todos seus dependentes so notificados de tal
mudana. De outra forma, se pode dizer que um ou mais objetos, denominados
observadores (observers) ou ouvintes (listeners) so registrados (ou se
registram) para observervar um determinado evento que pode acontecer por
meio de um objeto observado (subject). Normalmente, este objeto observado
mantm uma coleo de observadores.
Aplicabilidade
Este padro de projeto utilizado quando se deseja observar um evento
externo, tal como, uma ao do usurio, o que muito empregado em
programao orientada a eventos. Mudanas no valor de propriedades
(variveis) tambm empregam o uso deste padro de projeto.
A arquitetura Modelo-Viso-Controlador 3 (MVC Model-View-Controller)
faz uso freqente deste padro, pois ele empregado de forma a criar um
baixo acoplamento entre o Modelo e a Viso fazendo com que uma mudana
no Modelo alerte os seus observadores, que so, neste caso, as vises.
Estrutura
33
Padres de Projeto
Descrio
A classe Subject utilizada por classes concretas como interface
comum para que objetos possam se registrar como observadores, bem como
para que possam ser removidos, sendo que cada classe concreta pode ter uma
coleo de observadores. Qualquer classe pode ser um observador desde que
implemente a interface Observer e se registre com uma classe concreta de
Subject. Assim, os observadores sero notificados sempre que o estado da
classe concreta de Subject que os tenha registrado mude.
Exemplo de Cdigo
34
Padres de Projeto
35
Padres de Projeto
Observaes
Padres Relacionados
Singleton e Mediator.
Anti-Pattern
Quando uma classe se encarrega de observar um determinado evento e
tomar todas as aes necessrias fere o Princpio Aberto-Fechado, pois a
classe dever ser modificada para comportar novas aes.
36
Padres de Projeto
Adapter Estrutura
Descrio
Padro de projeto que possibilita converter a interface de uma classe em
outra necessria aplicao. Assim, classes com interfaces distintas ou
incompatveis podem trabalhar juntas.
Aplicabilidade
Quando h a necessidade de se usar uma classe existente e sua
interface no aquela esperada. Proporciona empregar o princpio de
composio, no qual um objeto adaptado com uma interface modificada.
Alm disto, possvel vincular uma aplicao cliente a uma determinada
interface, permitindo acrescentar novas funcionalidades aps a implementao
deste padro de projeto.
Estrutura
Descrio
De acordo com o Diagrama de Classes acima, a aplicao
Aplicao possui uma referncia classe Adapter (classe adaptadora).
De posse desta referncia, basta que o mtodo doWork() seja invocado para
que este possa realizar a chamada ao mtodo methodA(), na classe
37
Padres de Projeto
Adapter, que, por sua vez, invocar o mtodo methodB() presente na clase
Adaptee (classe adaptada).
Exemplo de Cdigo
Observaes
H dois tipos de adaptadores: objetos adaptadores e classes
adaptadoras. No primeiro caso, a adaptao realizada pelo princpio da
composio; enquanto, no segundo caso, a adaptao propiciada pelo
conceito de herana mltipla, conceito este inexistente na linguagem Java.
Padres Relacionados
Bridge, Decorator e Proxy.
Anti-Pattern
O anti-pattern deste padro de projeto d-se pela existncia de uma ou
mais classes cuja interface difere das interfaces de classes existentes e tm
certa relao com a nova classe ou classes. A codificao do sistema dever
levar em considerao estas possveis novas classes e isto acarretar um
38
Padres de Projeto
39
Padres de Projeto
Faade Estrutura
Apresentao
Este padro de projeto fornece uma interface nica para um conjunto de
interfaces em um subsistema, definindo uma interface de nvel mais alto que
facilita o uso do subsistema. Desta forma, o acoplamento entre a aplicao
cliente e os subsistemas torna-se minimizado.
Aplicabilidade
medida que os sistemas de software evoluem, eles se tornam mais
complexos devido necessidade de se executar um conjunto de operaes de
uma nica vez ou em uma dada seqncia. Quando h necessidade de se criar
um ponto comum de execuo para um conjunto de operaes, o padro de
projeto Faade aplicado para a criao deste ponto comum (ou interface)
para um determinado subsistema, simplificando e unificando um grupo de
classes acessveis mediante o uso de uma nica classe.
Estrutura
40
Padres de Projeto
Descrio
Aplicao1 e Aplicao2 faz uso apenas de Faade, mediante uma
chamada ao mtodo metodo(), para acesso aos subsistemas para os quais a
fachada foi implementada.
Exemplo de Cdigo
Observaes
A utilizao deste padro de projeto permite a aplicao do princpio
denominado Princpio do Menor Conhecimento (Principle of Least
Knowledge). Este princpio atesta que se deve cuidar com o nmero de
classes com as quais um determinado objeto se relaciona e como este
relacionamento realizado. Evitar o alto acoplamento garante que mudanas
tero pouco ou nenhum impacto na relao entre objetos.
Padres Relacionados
Abstract Factory e Mediator.
41
Padres de Projeto
Anti-Pattern
A realizao de uma venda implica em uma srie de operaes
necessrias sua efetivao. Estas operaes podem ser, por exemplo, a
baixa no estoque de produtos, a verificao de viabilidade financeira do cliente
para efetuar a compra e a realizao de lanamentos nos registros de contas a
receber e de caixa. Neste caso, o que se deseja a efetivao da venda, mas
este processo est fortemente acoplado a outros subsistemas.
42
Padres de Projeto
Prototype Criao
Apresentao
Especifica os tipos de objetos a criar usando uma instncia de prottipo,
criando-os mediante cpia (ou clonagem) deste prottipo. Esta operao
realizada sem que a aplicao saiba qual classe especfica est sendo
instanciada.
Aplicabilidade
Em situaes nas quais criar instncias de objetos a partir de hierarquias
de classes complexas e quando a classe de um objeto conhecida somente
em tempo de execuo so exemplos do uso deste padro de projeto.
Estrutura
Descrio
A utilizao deste padro de projeto d-se pela existncia de uma classe
base (ou interface) contendo a declarao do mtodo clone() e, dependendo
da implementao, mantm um coleo (na forma de um dicionrio, por
exemplo) de classes concretas derivadas da classe base (ou que implementem
a interface).
43
Padres de Projeto
Exemplo de Cdigo
Observaes
Eventualmente, padres de projeto de criao competem entre si em
uso. s vezes pode-se utilizar ou o padro de projeto Prototype ou Abstract
Factory. Enquanto em outros casos, ambos so complementos um do outro.
Padres Relacionados
Abstract Factory, Composite e Decorator.
44
Padres de Projeto
Anti-Pattern
O uso deste padro de projeto destina-se a criar cpias (clones) a partir
de uma instncia denominada prottipo. Assim, o seu anti-pattern a situao
na qual toda vez que uma cpia de um determinado objeto necessria sua
criao deve ser realizada, comprometendo, possivelmente, o desempenho da
aplicao e a quantidade de memria para comportar um nmero elevado de
objetos.
45
Padres de Projeto
Decorator Estrutura
Apresentao
Este padro de projeto possibilita o acrscimo de funcionalidades a um
objeto, e no a uma classe, em tempo de execuo, provendo uma alternativa
bem flexvel como mecanismo de extenso de classes. O acrscimo de tais
funcionalidades realizado pelo encadeamento de um conjunto de objetos,
sendo que os primeiros tratam das novas funcionalidades e o ltimo da
funcionalidade original.
Aplicabilidade
O uso deste padro de projeto torna possvel estender (decorar) a
funcionalidade de uma classe em tempo de execuo, ao contrrio do
mecanismo de extenso, que acrescenta funcionalidade em tempo de
compilao. Isto acontece quando a classe decoradora cria um invlucro na
classe original recebendo como parmetro em sua construo um objeto da
classe original.
Estrutura
46
Padres de Projeto
Descrio
Objetos Component podem ser usados por si s ou decorados e cada
Decorator possui uma referncia a Component, que estendido (classe
abstrata) por Decorator. Alm desta referncia, ConcreteDecorators
podem ampliar o estado de Component, acrescentando novos mtodos, por
exemplo. A ampliao do estado de Component, com o acrscimo de novos
mtodos, normalmente realizada antes ou depois dos mtodos de
Component.
Exemplo de Cdigo
47
Padres de Projeto
48
Padres de Projeto
InputStreamReader(new
Observaes
Padres Relacionados
Adapter, Composite e Strategy.
Anti-Pattern
Em um cenrio que conta com um conjunto de classes derivas de uma
mesma classe pode ser difcil ou mesmo impraticvel criar uma nova classe
que faa uso de funcionalidades de classes existentes nesta hierarquia. Mesmo
que isto seja possvel, a proliferao de classes acabaria por criar uma
quantidade muito grande de classes com funcionalidades repetidas.
49
Padres de Projeto
Builder Criao
Apresentao
Este padro de projeto apropriado quando se deseja criar um produto
em partes. O cliente, utilizando um objeto builder pede que o objeto produto
seja criado. O objeto builder invoca um conjunto de mtodos que possibilita a
criao do objeto produto, que , ento, retornado. Assim, possvel que um
objeto complexo possa ser criado sem que a aplicao (cliente) tenha
conhecimento de como suas vrias partes so criadas.
Aplicabilidade
Na criao de objetos complexos que devem ser montados
independentes de suas partes ou de sua montagem. Alm disto, o processo de
construo deve permitir diferentes representaes para o objeto que
construdo.
Estrutura
Descrio
O objeto Director realiza a construo de um objeto Product
mediante a construo de suas vrias partes, descritas pela interface Builder
e que so implementadas por ConreteBuilder.
50
Padres de Projeto
Exemplo de Cdigo
51
Padres de Projeto
os
vrios
exemplos,
podem
javax.xml.parsers.DocumentBuilder
ser
citadas
as
classes
e
Observaes
Padres Relacionados
Abstract Factory e Composite.
Anti-Pattern
O anti-pattern deste padro de projeto lida com o problema da criao
de objetos complexos de forma aleatria e espalhada pelo cdigo. Se um novo
objeto precisa ser criado a modificao na aplicao para realizar esta nova
operao onerosa em termos de tempo e propensa incluso de erros em
cdigo que j havia sido testado e validado.
52
Padres de Projeto
Aplicabilidade
Partes de um algoritmo genrico so implementadas em uma classe
comum a partir da qual suas subclasses podem ou devem implementar as
partes especficas.
Estrutura
Descrio
A classe AbstractClass possui o mtodo templateMethod() e as
assinaturas de mtodos abstratos, usados pelo mtodo template, que devem
ser implementados por classes descendentes. Uma vez que a classe contendo
o mtodo com os passos comuns (ou genricos) tenha sido criada, vrias
classes concretas podem existir, cada uma implementando as partes
especficas do algoritmo.
53
Padres de Projeto
Exemplo de Cdigo
Observaes
Um dos conceitos mais importantes em projetos de software trata do
reuso de cdigo e o padro de projeto Template Method fundamental neste
54
Padres de Projeto
Padres Relacionados
Factory Method e Strategy.
Anti-Pattern
Se o cdigo necessrio a uma tarefa composto de partes que so
especficas a determinadas situaes o programador escrever estas partes
utilizando um conjunto de if-else-if-else.... Mais uma vez, uma atitude como
esta torna o cdigo final um emaranhado de condies, que continuaro a
crescer media que novas condies forem impostas como requisitos
aplicao.
55
Padres de Projeto
Iterator Comportamento
Apresentao
Este padro de projeto fornece uma interface comum para que uma
coleo de objetos possa ser percorrida sem, no entanto, que a aplicao tome
conhecimento de como tais objetos esto agrupados.
Aplicabilidade
A utilizao deste padro de projeto possibilita aplicao ter acesso ao
contedo de um objeto agregado sem que sua representao interna seja
exposta. A coleo de objetos pode ser percorrida em ambas as direes, de
acordo com a declarao da interface.
Estrutura
Descrio
Collection a interface comum que disponibiliza a assinatura do
mtodo createIterator(), entre outros, que deve ser implementado pelas
classes descendentes e cujas implementaes permitem o percorrimento da
coleo de objetos (agregado). Assim, cada coleo concreta implementa o
algoritmo de percorrimento de acordo com a representao de seus dados,
retornando aplicao uma referncia interface Iterator, que apresenta
uma interface comum utilizada para percorrer da coleo de objetos.
56
Padres de Projeto
Exemplo de Cdigo
57
Padres de Projeto
Observaes
Padres Relacionados
Composite, Factory Method e Memento.
Anti-Pattern
Neste caso, o anti-pattern implementado diretamente na classe que
descreve a coleo de objetos, deixando que a aplicao tenha acesso
representao destes dados.
58
Padres de Projeto
Composite Estrutura
Apresentao
Objetos so compostos em uma estrutura semelhante a uma rvore
para representar hierarquias todo-parte. Assim, este padro de projeto permite
que elementos primitivos e composies de elementos sejam tratados de forma
semelhante.
Aplicabilidade
Quando se deseja modelar relaes de componentes e estes, por sua
vez, tambm so constitudos de outros componentes.
Estrutura
Descrio
A aplicao cliente faz uso de Component para ter acesso aos objetos
na composio. A interface Component, por sua vez, define uma interface
padro para todos os objetos na composio, tanto para elementos simples
ou primitivos (Leaf), quanto para elementos compostos (Composite). Leaf
implementa os mtodos para os elementos da composio, enquanto
Composite implementa os mtodos relacionados aos
elementos
na
composio.
59
Padres de Projeto
Exemplo de Cdigo
60
Padres de Projeto
de
componentes
grficos,
como,
por
exemplo,
JButton
Observaes
O padro de projeto Composite pode ser dividido, basicamente, em dois
grupos: Composio de Relao e Composio Taxonmica. No primeiro
caso, a relao todo-parte d-se pela composio de objetos complexos feita
de objetos menores, que podem, tambm, ser compostos de objetos ainda
menores. J no segundo caso, a relao de composio existe entre objetos de
tipos que so mais ou menos gerais.
A Composio Taxonmica geralmente utilizada quando se deseja
percorrer os seus elementos, encontrar alguma informao ou processar um
61
Padres de Projeto
Caso
Melhor/Pior
quando
implementao
do
Padres Relacionados
Decorator, Flyweight, Iterator e Visitor.
Anti-Pattern
No anti-pattern deste padro de projeto a composio substituda por
diversas referncias aos elementos que uma dada classe deve possuir. Para
que esta classe possa processar um novo elemento, outra referncia deve ser
acrescentada, o que, muito provavelmente, acarretar a mudana no
processamento das varias partes.
62
Padres de Projeto
State Comportamento
Descrio
Este padro de projeto permite que um objeto modifique seu
comportamento de acordo com a mudana de seu estado interno. Assim, temse a impresso que o objeto muda sua classe.
Aplicabilidade
O uso deste padro de projeto d-se quando o comportamento de um
objeto depende de seu estado e este comportamento deve se modificar em
tempo de execuo (runtime) de acordo com este estado e, tambm, quando
muitas declaraes condicionais (if-else-if-else) dependem do estado do
objeto. Neste caso, cada operao, que realizada de acordo com um valor
constante, deve ser transferida para uma classe prpria. Esta transferncia
permite tratar o estado do objeto como um objeto por si s.
Estrutura
Descrio
Context pode ser qualquer classe na aplicao que contm vrios
estados internos. Quando o mtodo request() invocado sobre o objeto
contexto, o processamento delegado ao objeto estado (State). Assim, os
estados concretos (ConcreteStateA, ConcreteStateB) tratam (manipulam)
as requisies provenientes do contexto e os estados concretos tm suas
prprias implementaes para o tratamento da requisio. Desta forma,
63
Padres de Projeto
quando Context muda seu estado (o(s) valor(es) de seu(s) atributo(s) (so)
alterado(s)), seu comportamento tambm muda.
Exemplo de Cdigo
Observaes
Padres Relacionados
Flyweight.
Anti-Pattern
Classes com extensos cdigos condicionais para tratarem seus diversos
estados so o exemplo de anti-pattern apresentado para este padro de
projeto.
64
Padres de Projeto
Strategy Comportamento
Apresentao
Este padro de projeto define uma famlia de algoritmos, os encapsula e
os torna intercambiveis. Estes algoritmos podem variar independente da
aplicao cliente que os usa.
Aplicabilidade
Este padro de projeto prov uma forma de configurar uma classe com
um de vrios comportamentos ou algoritmos. Alm disto, possvel esconder
da aplicao as estruturas de dados, possivelmente complexas, utilizadas
pelos diversos algoritmos. Isto permite que diferentes regras de negcios
possam ser utilizadas dependendo do contexto no qual elas ocorram,
significando que este padro de projeto fornece um meio de configurar uma
classe com um entre vrios comportamentos.
Estrutura
Descrio
Encapsula algoritmos em classes, permitindo que eles possam variar
independente da aplicao cliente que os usa. Isto possibilita a aplicao do
princpio denominado Princpio Aberto-Fechado (Open-Closed Principle), no
qual uma classe est aberta para extenses enquanto mantm-se fechado
para alteraes. Tal princpio alcanado pelo uso deste padro de projeto,
pois a aplicao cliente faz uso de uma classe base (classe abstrata ou
interface) e os detalhes de implementao esto presentes em classes
65
Padres de Projeto
Exemplo de Cdigo
66
Padres de Projeto
Observaes
Padres Relacionados
Flyweight.
Anti-Pattern
A utilizao de estruturas de seleo do tipo if-else-if-else-if-else...
torna a aplicao altamente acoplada ao conjunto de algoritmos que necessita
utilizar, alm de no ser possvel aplicar o Princpio Aberto-Fechado.
Checksums so valores produzidos por algoritmos matemticos cujo objetivo o de realizar verificao de dados.
67
Padres de Projeto
Proxy Estrutura
Apresentao
Este padro de projeto prov acesso controlado a outros objetos por
meio de um objeto substituto (ou procurador), denominado proxy.
Aplicabilidade
Normalmente, quando uma simples referncia a um objeto no
suficiente necessitando-se de uma que seja mais sofisticada, pois o acesso ao
objeto precisa ser controlado, possivelmente, verificando se os direitos de
acesso o permitem.
Alguns tipos de proxies que podem, dependendo da situao, ser
utilizados so: Proxy Remoto, Proxy Virtual, Proxy de Proteo e Proxy de
Referncia Inteligente.
Estrutura
Descrio
Tanto RealSubject quanto Proxy implementam a mesma interface,
Subject, o que permite que a aplicao possa tratar objetos Proxy como se
fossem objetos RealSubject. RealSubject realiza o trabalho verdadeiro,
enquanto Proxy simplesmente controla o acesso a ele. O objeto Proxy
mantm uma referncia a RealSubject, instanciando-o ou cuidando de sua
68
Padres de Projeto
Exemplo de Cdigo
Observaes
Um Proxy Remoto fornece uma referncia a um objeto localizado em
outro espao de endereamento, no mesmo computador ou em um
computador conectado rede. Normalmente, um proxy remoto utilizado em
69
Padres de Projeto
Padres Relacionados
Adapter e Decorator.
Anti-Pattern
Quando a invocao de um mtodo necessita que outras aes sejam
tomadas antes que este possa efetivamente ser executado, o padro de projeto
Proxy uma boa soluo. Caso a aplicao tenha que tomar cincia (algum
processamento, como, por exemplo, verificar direitos do usurio) das aes
necessrias antes ou depois da invocao de um determinado mtodo, isto a
torna complexa, de difcil manuteno e extensibilidade se tal processamento
for implementado na aplicao cliente.
70
Padres de Projeto
Visitor Comportamento
Descrio
Representa uma operao que executada em uma estrutura de
objetos. Novas operaes so definidas sem, no entanto, conhecer as classes
dos objetos sobre as quais elas sero executadas.
Aplicabilidade
Este padro de projeto pode ser utilizado quando uma estrutura de
objetos contm muitas classes com interfaces diferentes e se deseja executar
operaes distintas ou sem relao entre si. Isto evita a poluio de cdigo e
mantm cdigos relacionados em uma nica classe. Alm disto, normalmente a
freqncia de mudanas nas estruturas de objetos pequena, enquanto que
novas operaes podem ser acrescentadas medida que os requisitos se
modificam.
Estrutura
71
Padres de Projeto
Descrio
Este padro de projeto aplicado quando h necessidade de se
executar operaes semelhantes em objetos de diferentes tipos agrupados em
uma estrutura, possivelmente uma coleo. Ele tambm fornece um meio
prtico para o acrscimo de novos visitors que estendem funcionalidades prexistentes sem que o cdigo seja modificado.
Exemplo de Cdigo
72
Padres de Projeto
Observaes
O padro de projeto Visitor possibilita acrescentar funcionalidades a
bibliotecas de classes para as quais no h possibilidade de alterao no
cdigo fonte; obter dados de uma coleo de objetos no relacionados e
apresentar resultados de um processamento global.
Padres Relacionados
Composite e Interpreter.
Anti-Pattern
O anti-pattern deste padro pode levar a um cdigo rebuscado, confuso
e de difcil manuteno e extensibilidade. Como exemplo, tem-se um sistema
de vendas cujos produtos devem ser enviados aos clientes. Para que os envios
sejam processados faz-se necessrio aplicao verificar, por exemplo, por
meio do operador instanceof, qual o objeto venda sendo processado para
que o envio adequado de seus produtos seja realizado. Se novas classes
representando vendas e/ou novas classes representando envios forem
acrescentadas ao sistema, a verificao apontada tornar o cdigo maior e
mais complexo.
73
Padres de Projeto
Memento Comportamento
Apresentao
Este padro de projeto baseia-se em dois objetos: o objeto Originator
e o objeto Caretaker. O primeiro qualquer objeto da aplicao, enquanto o
segundo necessita realizar algum processamento no primeiro, mas precisa que
o estado inicial possa ser restaurado. Desta forma, o conceito de
encapsulamento no violado, o que, de outra forma, exporia aplicao os
detalhes de implementao do objeto que sofrer o processamento.
Aplicabilidade
Quando se deseja realizar algum processamento temporrio em
determinado objeto da aplicao, o padro de projeto Memento aplicado de
tal forma que um instantneo (snapshot) do estado (ou de parte deste) do
objeto em questo seja salvo para ser restaurado posteriormente ao
processamento realizado.
Estrutura
74
Padres de Projeto
Descrio
O objeto Caretaker deve realizar algum processamento com o objeto
Originator, possivelmente mudando seu estado. Antes que isto acontea, o
objeto Caretaker pede ao objeto Originator por uma referncia a
Memento, realiza o processamento desejado e devolve a referncia Memento
ao objeto Originator para que seu estado seja restaurado.
Exemplo de Cdigo
75
Padres de Projeto
Observaes
A implementao deste padro de projeto deve ser realizada com
cautela, pois o objeto Originator pode modificar outros objetos e este
padro de projeto age sobre um nico objeto.
Padres Relacionados
Command e Iterator.
Anti-Pattern
Para este padro de projeto o seu anti-pattern a falta da possibilidade
de restaurao do estado do objeto com o qual se deseja realizar algum
processamento (Originator). Mesmo que a aplicao acrescente a
possibilidade de restaurao de estado de um dado objeto sem a aplicao
deste padro de projeto, ainda seria o uso do anti-pattern, pois a aplicao
precisaria expor os detalhes de implementao do objeto em questo.
76
Padres de Projeto
Mediator Comportamento
Apresentao
Este padro de projeto prov uma interface unificada a um conjunto de
interfaces em um subsistema, fazendo com que a comunicao entre os vrios
objetos do subsistema seja realizada por um objeto. Desta forma, os objetos do
subsistema deixam de manter relaes entre si, reduzindo, assim, o
acoplamento.
Aplicabilidade
A aplicabilidade para este padro de projeto d-se quando se quer
separar a comunicao que vrios objetos tm entre si atravs de uma
interface bem definida, diminuindo, assim, suas interdependncias.
Estrutura
Descrio
Objetos Colleague so desacoplados uns dos outros. As classes
concretas de Colleague conversam com a implementao concreta de
Mediator, que, por sua vez, conduz a troca de mensagens entre objetos
Colleague.
77
Padres de Projeto
Exemplo de Cdigo
78
Padres de Projeto
Observaes
Este padro de projeto, bem como os padres Chain of Responsibility,
Command e Observer realizam o desacoplamento entre objetos remetentes e
destinatrios, mas com diferenas. O primeiro passa o remetente ao longo de
uma cadeia de destinatrios em potencial. O segundo descreve uma conexo
entre remetente e destinatrio mediante o uso de uma subclasse. E o ltimo
especifica uma interface que realiza um alto desacoplamento entre vrios
destinatrios, que sero notificados de alguma mudana.
Padres Relacionados
Faade e Observer.
Anti-Pattern
O anti-pattern para este padro de projeto trata do alto acoplamento
entre classes que necessitam se relacionar entre si. A evoluo e manuteno
deste tipo de cdigo trazem uma srie de dificuldades, entre elas a leitura
impraticvel do cdigo para reconhecer quem se relaciona com quem; o
acrscimo de uma nova classe que necessita manter um relacionamento com
outras classes que j se relacionam.
79
Padres de Projeto
Bridge Estrutura
Apresentao
Este padro de projeto possibilita que abstraes sejam desacopladas
de
suas
implementaes,
permitindo
que
ambas
possam
variar
Aplicabilidade
Em casos quando se deseja que a implementao seja selecionada em
tempo de execuo evitando o seu vnculo com a abstrao. Quando abstrao
e implementao devem ser estendidas por meio de classes derivadas
permitindo combinar diferentes abstraes e implementaes.
Estrutura
Descrio
A relao entre Abstraction e Implementor conhecida como
bridge e todos os mtodos na abstrao so implementados em funo da
implementao,
pois
Abstraction
possui
uma
referncia
para
80
Padres de Projeto
Exemplo de Cdigo
81
Padres de Projeto
Observaes
Apesar de os padres de projeto State, Strategy, Bridge e, em menor
grau, Adapter terem estruturas semelhantes, eles so aplicados para a soluo
de diferentes problemas.
Padres Relacionados
Abstract Factory e Adapter.
Anti-Pattern
Quando uma implementao est diretamente vinculada sua abstrao
tem-se o anti-pattern para o padro de projeto Bridge, pois se novos requisitos
surgirem, tanto para a abstrao quanto para a implementao, a proliferao
de classes aumentar muito, tornado a evoluo da aplicao difcil e
trabalhosa.
82
Padres de Projeto
Flyweight Estrutura
Apresentao
Este padro de projeto se prope s aplicaes que necessitam de
grandes quantidades de dados, porm usando o compartilhamento de objetos,
evitando, assim, o consumo (muitas alocaes) de memria.
Aplicabilidade
Aplica-se este padro de projeto quando h a necessidade de se
compartilhar um grande volume de dados. A aplicao cria os dados uma vez e
os compartilha atravs de um ou mais objetos.
Estrutura
Descrio
Flyweight declara uma interface comum a partir da qual classes
concretas recebero e atuaro sobre estado extrnseco (aquele que
dependente do contexto no qual o objeto est atuando). A classe (fbrica)
FlyweightFactory cria e cuida de objetos
Flyweight, que so
no
precise
ser
compartilhada.
Neste
caso,
83
Padres de Projeto
Exemplo de Cdigo
84
Padres de Projeto
Observaes
Em comparao com o padro de projeto Faade, que permite que um
nico objeto represente um subsistema completo, o padro de projeto
Flyweight permite criar uma grande quantidade de pequenos objetos.
Padres Relacionados
Composite, State e Strategy.
Anti-Pattern
A cada processamento uma quantidade pequena de informaes
necessria sua realizao. Se a cada realizao deste processamento novos
objetos para estas informaes forem criados, a aplicao ter seu
desempenho comprometido e haver uma alta redundncia de objetos
contendo o mesmo estado.
85
Padres de Projeto
Interpreter Comportamento
Apresentao
Padro de projeto utilizado para modelar a gramtica para uma
linguagem especfica a um domnio de problemas.
Aplicabilidade
Analisadores de expresses regulares, expresses algbricas e
partituras musicais (um dado som e sua durao), alm de linguagens de
consulta (query language) e protocolos de comunicao so exemplos da
aplicabilidade deste padro de projeto.
Estrutura
Descrio
AbstractExpression declara a operao comum a todos os
elementos na rvore de sintaxe abstrata, enquanto TerminalExpression
implementa tal operao para um determinado elemento terminal (que no
pode
ser
definido
em
termos
de
outros
elementos).
86
Padres de Projeto
Exemplo de Cdigo
87
Padres de Projeto
Observaes
Este padro de projeto bem pouco utilizado em aplicaes de um
modo geral, sendo mais usado em aplicaes especficas, nas quais se faz
necessrio a criao de uma linguagem para um determinado domnio de
aplicao.
Padres Relacionados
Composite, Flyweight, Iterator e Visitor.
Anti-Pattern
A definio de uma linguagem para um domnio um problema de
soluo complexa. Assim, torna-se difcil o desenvolvimento de uma aplicao
que no use este padro de projeto, visto que ele possui uma aplicao bem
especfica.
88
Padres de Projeto
REFERNCIAS
AntiPatterns. <http://www.antipatterns.com/> Acesso 27/04/2008.
FREEMAN, Eric; FREEMAN, Elisabeth; BATES, Bert; SIERRA, Kathy. Head
First Design Patterns OReilly: 2004.
GAMMA, Erich; HELM, Richard; JOHNSON, Ralph; VLISSIDES, John. Design
Patterns: elements of reusable object-oriented software Addison-Wesley:
1994.
HOUSTON, Vince.
Acesso 27/04/2008.
Design Patterns
<http://www.vincehuston.org/dp/>
LARMAN, Craig. Applying UML and Patterns: An introduction to ObjectOriented Analysis and Design and Iterative Development. 3 ed. Addison
Wesley Professional: 2004.
Net
Objectives
The
Net
Objectives
Pattern
Repository
Anti-pattern
89