Você está na página 1de 105

Universidade Presbiteriana Mackenzie

Design Patterns
Estruturais

Ana Claudia Rossi

Faculdade de Computao e Informtica


Categorias de padres GoF
Criacionais Estruturais Comportamentais
Abstract Factory Adapter Chain of Responsibility
Builder Bridge Command
Factory Method Composite Interpreter
Prototype Decorator Iterator
Singleton Faade Mediator
Flyweight Memento
Proxy Observer
State
Strategy
Template Method
Visitor
GOF - Adapter
Objetivo: converter a interface de uma classe em outra interface
esperada pelos clientes
Adapter permite a comunicao entre classes que no
poderiam trabalhar juntas devido incompatibilidade de suas
interfaces.
Adapter
Inteno: adaptar um objeto preexistente para uma
interface especfica com a qual um outro objeto espera se
comunicar.

Soluo: Definir uma classe que serve como um adaptador e


que age como um intermedirio entre o objeto e seus
clientes (utilizar herana ou composio). O adaptador
traduz comandos do cliente para o fornecedor e os
resultados do fornecedor para o cliente.
Ou Delegao
Ou usa composio
Ou usa composio
Ou delegao
Adapter (exemplo)
Adapter (exemplo)
No posso usar XXCircle diretamente porque quero preservar o
comportamento polimrfico em Shape.
Diferentes nomes e listas de parmetros
XXCircle no deriva de Shape

Soluo: definir uma classe Circle que sirva como um


adaptador para XXCircle.
Circle deriva de Shape
Circle contm XXCircle
Circle repassa mensagens enviadas para ele diretamente para
XXCircle.
Adapter (exemplo)
Adapter (exemplo)
Adapter (aplicabilidade)
Quando se quer usar uma classe j existente e sua interface
no combina com a esperada pelo cliente;
Quando se quer criar uma classe reutilizvel que coopera com
classes no relacionadas ou no previstas, isto , classes que
no necessariamente tenham interfaces compatveis;
Quando se necessita usar vrias classes existentes, mas
impraticvel adaptar atravs da transformao de suas
interfaces para transform-las em subclasses de uma mesma
classe.
Adapter (estrutura)
Exemplo
Como fazer interface com um banco de dados qumico legado
(adaptado [Software Design Patterns, 2005]). Objetos da
classe de CompostoQuimico acessam o banco de dados
atravs de uma interface que utiliza o Padro Adapter.
CompostoQumico : Define a interface de domnio especfico que o
cliente utiliza, ou seja, esta classe contm somente o que a classe Tela
conhece.
Composto : Adapta a interface CompostoQuimico para ser utilizada
pela classe BDQuimico, para posteriormente os dados sejam
mostrados na tela.
BDQuimico : Define uma interface pr-existente que necessita ser
adaptada, neste exemplo ela armazena os dados de cada composto
qumico, que so acessados e adaptados para a tela cliente.
Exemplo
Adapter (conseqncias)
Adapta a classe Adaptee BaseClasse pelo comprometimento
com a classe concreta Adapter.
Como resultado, a classe Adapter no funcionar quando se
quiser adaptar uma classe e todas as suas subclasses;
Um nico objeto Adapter trabalha com vrias classes Adaptee
Quer dizer, a prpria classe Adaptee e todas as suas subclasses
(se houver).
O objeto Adapter pode adicionar funcionalidades a todas as
classes Adaptee de uma s vez.
GOF - Composite

como criar objetos utilizando partes de


tal forma que tanto o objeto todo
quanto os objetos parte forneam a
mesma interface para os seus clientes?
Composite
So comuns as situaes onde temos que lidar com uma
coleo de elementos estruturada hierarquicamente (em vez
colees lineares).
Problema: como criar objetos utilizando partes de tal forma
que tanto o objeto todo quanto os objetos parte forneam a
mesma interface para os seus clientes?
Composies podem cumprir com este requisito e ainda
permitir:
o tratamento da composio como um todo;
ignorar as diferenas entre composies e elementos
individuais;
a adio transparente de novos tipos a hierarquia;
a simplificao do cliente.
Composite (estrutura)
Composite (estrutura)
Tratar grupos e indivduos diferentes
atravs de uma nica interface
Composite (exemplo)
Expresses lgicas (booleanas)
Exemplo
Criar uma aplicao que simula sistema de arquivos do
Windows/UNIX . O Sistema de arquivos consiste
principalmente de dois tipos de componentes pastas
(directories) e arquivos (files). Pastas podem ser formadas por
outras pastas ou arquivos, entretanto arquivos no podem
conter qualquer componentes do sistema de arquivos . Neste
aspecto, diretrios atuam como ns no terminais e arquivos
como nes terminais da estrutura da arvores
Primeira Modelagem

Composite:
Tratar grupos e indivduos diferentes atravs de uma nica interface
Segunda Modelagem Modelagem

Composite:
Tratar grupos e indivduos diferentes atravs de uma nica interface
No suportado pelo tipo arquivo
Exemplo
Como definir estratgias de estabelecimento
de preo compostas
Composite (conseqncias)
Objetos complexos podem ser compostos de objetos mais
simples recursivamente.
Permite forma assim uma hierarquia de objetos
O cliente pode tratar objetos parte e objetos todo da
mesma forma.
Isso resulta na simplificao deste cliente.
Os clientes normalmente no sabem (e nem devem se
preocupar) se eles esto tratando um componente individual
ou composto.
Facilita a adio de novos componentes: o cliente no tem
que mudar com a adio de novos objetos
Sejam eles simples ou compostos
Composite (conseqncias)
O projeto pode ficar geral demais, o que torna mais difcil
restringir os possveis componentes de um objeto composto.
Por exemplo, em uma hierarquia que contenha documentos e
suas partes (sees, pargrafos, etc.), podemos compor sees
com documentos, etc. o que no faz sentido
Composite (aplicabilidade)
Quando necessrio representar hierarquias do tipo todo-
parte.
Quando necessrio tratar todo e respectivas partes de
forma indistinta.
GOF - Faade

Oferecer uma interface nica para um conjunto de


interfaces de um subsistema.
Faade define uma interface de nvel mais elevado que
torna o subsistema mais fcil de usar
Faade
Faade (estrutura)
Faade
Faade em Java
Faade (aplicabilidade)
Sempre que for desejvel criar uma interface para um
conjunto de objetos com o objetivo de facilitar o uso da
aplicao
Permite que objetos individuais cuidem de uma nica tarefa, deixando
que a fachada se encarregue de divulgar as suas operaes
Fachadas viabilizam a separao em camadas com alto grau
de desacoplamento
Existem em vrias partes da aplicao
Fachada da aplicao para interface do usurio
Fachada para sistema de persistncia: Data Access Object
Faade (conseqncias)
Fachadas podem oferecer maior ou menor isolamento entre
aplicao cliente e objetos
Nvel ideal deve ser determinado pelo nvel de acoplamento desejado
entre os sistemas
A fachada mostrada como exemplo isola totalmente o cliente
dos objetos
Facade f;
// Obtem instancia f
f.registrar("Z", 123);
Outra verso com menor isolamento (requer que aplicao-
cliente conhea objeto Cliente)
Cliente joao= Cliente.create("Joo", 15);
f.registrar(joao);
// mtodo registrar(Clientec)
Decorator

Anexar responsabilidades adicionais a um objeto


dinamicamente. Decorators oferecem uma alternativa
flexvel ao uso de herana para estender uma
funcionalidade
Problema
Estrutura do Padro - Decorator
Decorator
Inteno
Dinamicamente, agregar responsabilidades adicionais a um objeto. Os
Decorators fornecem uma alternativa flexvel ao uso de subclasses
para extenso de funcionalidades

Motivao
Algumas vezes se quer adicionar responsabilidades a um objeto, mas
no sua classe. Acontece, por exemplo, com criao de interfaces
grficas, quando se deseja acrescentar uma borda a um componente
qualquer ou um scrollbar a uma rea de texto
Uma forma de se acrescentar responsabilidades atravs de herana,
mas isto torna o projeto inflexvel, pois a escolha da borda definida
em tempo de compilao. Neste caso o cliente no pode controlar
como e onde decorar o componente com uma borda.
Uma abordagem mais flexvel inserir o componente em outro objeto
que adiciona a borda, um Decorator
Estrutura do Padro - Decorator

Componente Define a interface para objetos que podem ter responsabilidades acrescentadas
aos mesmos dinamicamente
Estrutura do Padro - Decorator

ComponenteConcreto Define um objeto para o qual responsabilidades adicionais podem ser


atribudas
Estrutura do Padro - Decorator

Decorador mantm uma referncia para um objeto Componente e define uma interface que
segue a interface de Componente
Estrutura do Padro - Decorator

DecoradorConcreto Acrescenta responsabilidades ao componente


Exemplo

aTextView aBorderDecorator
aScrollDecorator

aBorderDecorator
aScrollDecorator
component aTextView
component
Componente
Exemplo
VisualComponent
Draw()

Decorator
TextView Decorator
Draw() Draw() component Draw()

ComponenteConcreto

ScrollDecorator BorderDecorator

scrollPosition borderWidth

Draw() Draw() Decorator:: Draw()


Scrollto() DrawBorder() DrawBorder();

ComponenteConcretoA ComponenteConcretoB
Exemplo
Aplicabilidade
Para adicionar responsabilidades a objetos individuais
de forma dinmica e transparente, sem afetar outros
objetos
Para responsabilidades que podem ser removidas
Quando extenso atravs de herana impraticvel.
Algumas vezes uma grande quantidade de extenses
independentes so possveis e seria necessrio um imenso
nmero de subclasses para suportar cada combinao
possvel entre elas.
Quando uma definio de classe pode estar escondida
ou no disponvel para herdar.
Conseqncias
Mais flexibilidade que herana
Evita incorporao forada de comportamentos
desnecessrios
Um decorador e seu componente no so idnticos!
Uma poro de objetos pequenos
Bridge

Desacoplar uma abstrao de sua implementao para


que os dois possam variar independentemente
Bridge
Inteno: desacoplar uma abstrao de sua implementao
de tal forma que a implementao possa ser facilmente
trocada.

Soluo: encapsular os detalhes de implementao em um


objeto que um componente da abstrao
Bridge (estrutura)

Abstraction define a interface da abstrao. Mantm uma referncia para um objeto do tipo
Implementor
Bridge (estrutura)

RefinedAbstraction estende a interface definida pelo Abstraction


Bridge (estrutura)

Implementor Define a interface para as classes de implementao. Esta interface no precisa


corresponder exatamente interface de Abstraction; de fato, as duas interfaces podem ser bem
diferentes podem ser bem diferentes. A interface de Implementor fornece somente operaes
primitivas e Abstraction define as operaes de nvel mais alto baseadas nestas primitivas.
Bridge (estrutura)

ConcreteImplementor Implementa a interface de Implementor e define sua implementao


concreta
Exemplo
Considere a implementao de uma Janela portvel em um Toolkit para interfaces de
usurios. Por exemplo, esta abstrao deveria nos habilitar a escrever aplicaes que
trabalham tanto com o sistema Xwindow como com Presentation Manager da IBM.Pode-se
usar herana para definir uma classe abstrata e as subclasses Xwindow e PMWindow que
implementam interface Janela paa diferentes plataformas.
Problemas com esta abordagem
Pode ser necessrio estender para cobrir diferentes tipos de
janelas ou novas plataformas
Torna o cdigo dependente de plataforma
Sempre que uma janela, instncia uma classe concreta que tem uma
implementao especfica
Soluo
Problema
Considere a construo de um mdulo para desenhar figuras.
Considere que h duas classes externas de desenho a serem
utilizadas: DP1 e DP2
Primeira verso: somente retngulos devem ser
desenhados.
Soluo:
Problema
Suponha agora, o seguintes novos requisitos:
As classes externas agora desenham crculos. Portanto, nosso
mdulo de desenho deve tambm ter a possibilidade de
desenhar crculos.
Alm disso, o cliente do nosso mdulo de desenho no precisa
saber a diferena entre um retngulo e um crculo.
Soluo:
Criamos uma classe abstrata Shape, e fazemos com que ela seja
superclasse tanto de Rectangle quanto de Circle.
O cliente agora se comunica com objetos Shape.
Sendo assim, temos uma nova soluo, apresentada a seguir...
Sem aplicar Bridge
Depois
Antes
Soluo sem Bridge
Infelizmente, a soluo da figura anterior introduz alguns
problemas:
O que acontece se preciso dar suporte a um novo programa de
desenho?
E se um novo tipo de Figura (Shape) tiver que ser adicionado?
O que aconteceria com a complexidade de manuteno neste
mdulo quando a quantidade de tipos de figura e de mdulos
externos de desenho chegasse cada das dezenas?
Resposta: exploso de classes.
Soluo sem Bridge
A exploso de classes surge porque, nesta soluo, a
abstrao (ou seja, os tipos de Shape) e a implementao (os
programas de desenho) esto fortemente acoplados.
i.e., cada tipo de figura (abstrao) deve saber que tipo de
mdulo externo (implementao) ele deve utilizar.
Precisamos de um modo de separar (desacoplar) as variaes
na abstrao das variaes na implementao, de tal forma
que o nmero de classes cresa somente linearmente.
Esta exatamente a inteno (objetivo) do padro Bridge.
Soluo com aplicao - Bridge
Bridge (exemplo)
Java Swing possui diversos look and feels.
Objetos JFrame, JButton, etc. possuem um componente interno
(peer) que construdo para com um look and feel particular.
No entanto, clientes (programadores) somente precisam
interagir com JFrame, JButton, etc.
Bridge (exemplo)
O mtodo UIManager.setLookAndFeel define a fbrica concreta
para produtos do Windows.

WindowsLookAndFeel DefaultLookAndFeel
Bridge (exemplo)
Exemplo: usando o padro Bridge para abstrair o driver
especfico de banco de dados.

JDBC JDBC Implementation


imp

MySQL JDBC Oracle JDBC Postgress JDBC


Driver Driver Driver
Bridge (aplicabilidade)
Aplicabilidade
O padro Bridge til quando se tem uma abstrao que tem
diferentes implementaes.
Este padro permite que a abstrao e a sua implementao
variem independentemente.
Proxy

Prover um substituto ou ponto atravs do


qual um objeto possa controlar o acesso a
outro
Problema
Proxy
Inteno
Fornece um substituto ou marcador da localizao
de outro objeto para controlar o acesso ao mesmo
Motivao
Controlar o acesso a um objeto adiar o custo
integral de sua criao e inicializao at o
momento em que realmente necessrio sua
utilizao
Estrutura do Proxy

Proxy

Cliente usa intermedirio em vez


de sujeito real
Estrutura do Proxy

Proxy

Intermedirio suporta a mesma


interface que sujeito real
Estrutura do Proxy

Proxy

Intermedirio contm uma referncia para o


sujeito real e repassa chamadas, possivelmente,
acrescentando informaes ou filtrando dados no
processo
Proxy em Java
Quando usar?
Flyweight

Usa o compartilhamento para suportar


grandes quantidades de objetos de
granularidade fina de maneira eficiente
Problema
Pool de Objetos Imutveis
Compartilhados
Exemplo

A maioria das implementaes de editores de documentos tem recursos para formatao e


edio de textos que so, at certo ponto, modularizados. Editores orientados a objetos usam
objetos para representar elementos embutidos.
Exemplo

A maioria das implementaes de editores de documentos tem recursos para formatao e


edio de textos que so, at certo ponto, modularizados. Editores orientados a objetos usam
objetos para representar elementos embutidos.
Exemplo
Flyweight

UnsharedConcreteFlyweight UnsharedConcreteFlyweight
ConcreteFlywieght

A maioria das implementaes de editores de documentos tem recursos para formatao e


edio de textos que so, at certo ponto, modularizados. Editores orientados a objetos usam
objetos para representar elementos embutidos.
Intrinsic Information Imutvel
Informao intrnseca de um objeto independente do contexto.
Significa que a informao intrnseca a informao comum que
permanece constante entre diferentes instncias de uma determinada
classe
Por exemplo informaes da Empresa em um carto de visitas a
mesma para todos os empregados .
Extrinsic Information Mutvel
Informao extrnseca de um objeto dependente do contexto do
objeto e varia com o contexto do objeto
Significa que a informao nica para cada instncia de uma dada
classe
Por exemplo, o nome do empregado e ttulo so extrnsecas para cada
carto de visita como esta informao nica para cada empregado
Estrutura do Padro

Declara uma interface


atravs da qual flyweight
podem receber e atuar
sobre estados extrnsecos
Estrutura do Padro

Implementa uma interface Flyweighte acrescenta armazenamento para estados intrinsecos, se


houver. Um objeto ConcreteFlyweight deve ser compartilhvel. Qualquer estado que ele
armazene deve ser intrinseco; ou seja, deve ser independnete do contexto do objeto
ConcreteFlyweight
Estrutura do Padro

Nem todas as subclasses Flyweight necessitam ser compartilhados. A interface de


Flyweight habilita o compartilhamento; ela no fora ou garante o mesmo. comum para
objetos UnsharedConcreteFlyweight no compartilhar objetos ConcreteFlyweight como
filhos em algum nvel da estruutra dos objetos de flyweight
Estrutura do Padro

- Cria e gerencia objetos flyweight;


- Garante que flyweights sejam comprtilhados adequadamente. Quando um cliente solicita
um flyweight,um objeto FlyweightFactory fornece uma instncia existente ou cria uma, se
nenhuma existir
Estrutura do Padro

- mantm uma referncia para flyweight(s)


- ccomputa ou armazena o estado extrinseco do flyweight(s).
Diagrama Objetos
Vantagens e Desvantagens
Flyweight uma soluo para construo de
aplicaes usando objetos imutveis
Ideal para objetos que oferecem servios (guardados em
caches e em pools)
Ideal para objetos que podem ser usados para construir
outros objetos
Problemas
Possvel impacto na performance
se houver muitas representaes diferentes, elas no podem ser
alteradas, e preciso criar muitos objetos
Questes
Cite exemplos de Flyweight em Java
Aplicaes
API Java
Seria uma boa idia ter principalmente objetos
imutveis em uma aplicao
Quais as vantagens?
Quais as desvantagens? Cenrios?
Solues?
Questes?
Cite exemplos do uso de Proxy
Em frameworks
Na API Java
Qual a diferena entre um Proxy e um
Adapter?
Qual a diferena entre um Faade e um Proxy?
E entre um Adapter e um Faade?
Obrigado

Ana Claudia Rossi


ana.rossi@mackenzie.br

105

Você também pode gostar