Escolar Documentos
Profissional Documentos
Cultura Documentos
Design Patterns
Design Patterns
Objetivos
Apresentar cada um dos 23 padres clssicos (catlogo do Gang of Four) descrevendo [2][GoF]
O problema que solucionam A soluo Diagramas UML Exemplos em Java Aplicaes tpicas
O que um padro?
Maneira testada ou documentada de alcanar um objetivo qualquer
Padres so comuns em vrias reas da engenharia
Responsabilidades
Booch e Rumbaugh Responsabilidade um contrato ou obrigao de um tipo ou classe. Dois tipos de responsabilidades dos objetos:
De conhecimento (knowing): sobre dados privativos e encapsulados; sobre objetos relacionados; sobre coisas que pode calcular ou derivar. De realizao (doing): fazer alguma coisa em si mesmo; iniciar uma ao em outro objeto; controlar e coordenar atividades em outros objetos.
Responsabilidades e Mtodos
A traduo de responsabilidades em classes e mtodos depende da granularidade da responsabilidade Mtodos so implementados para cumprir responsabilidades
Uma responsabilidade pode ser cumprida por um nico mtodo ou uma coleo de mtodos trabalhando em conjunto
Responsabilidades do tipo knowing geralmente so inferidas a partir do modelo conceitual (so os atributos e relacionamentos)
Padres
Padres so um repertrio de solues e princpios que ajudam os desenvolvedores a criar software e que so codificados em um formato estruturado consistindo de
Nome Problema que soluciona Soluo do problema
O objetivo dos padres codificar conhecimento (knowing) existente de uma forma que possa ser reaplicado em contextos diferentes
Padres GRASP
Introduzidos por Craig Larman em seu livro Applying UML and Patterns [4] GRASP: General Responsibility and Assignment Software Patterns
Os padres GRASP descrevem os princpios fundamentais da atribuio de responsabilidades a objetos, expressas na forma de padres
Se voc conhece os padres GRASP, pode dizer que compreende o paradigma orientado a objetos
8
Mais padres?
H vrios catlogos de padres em software
Muitos so especficos a uma determinada rea (padres J2EE, padres de implementao em Java, em C#, padres para concorrncia, sistemas distribudos, etc.) Os padres apresentados aqui so aplicveis em Java e outras linguagens
Elementos de um padro
Nome Problema
Quando aplicar o padro, em que condies?
Soluo
Descrio abstrata de um problema e como usar os elementos disponveis (classes e objetos) para solucion-lo
Conseqncias
Custos e benefcios de se aplicar o padro Impacto na flexibilidade, extensibilidade, portabilidade e eficincia do sistema
13
Metsker [1] os classifica em 5 grupos, por inteno (problema a ser solucionado): Padres GRASP focam
(1) oferecer uma interface, neste objetivo (2) atribuir uma responsabilidade, (3) realizar a construo de classes ou objetos (4) controlar formas de operao (5) implementar uma extenso para a aplicao
14
2. Estrutura
Class Adapter Object Adapter Bridge Composite Decorator Facade Flyweight Proxy
3. Comportamento
Interpreter Template Method Chain of Responsibility Command Iterator Mediator Memento Observer State Strategy Visitor
* Padres "clssicos" selecionados e organizados por Gamma et al. "Design Patterns" [2]
15
Fonte: [2]
17
Introduo: interfaces
Interface: coleo de mtodos e dados que uma classe permite que objetos de outras classes acessem Implementao: cdigo dentro dos mtodos Interface Java: componente da linguagem que representa apenas a interface de um objeto
Exigem que classe que implementa a interface oferea implementao para seus mtodos No garante que mtodos tero implementao que faa efetivamente alguma coisa (chaves vazias): stubs.
18
19
1
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." [GoF]
Problema e Soluo
Problema
Cliente operacao()
void operacao() { metodoEsperado(); }
Soluo
Adaptador metodoEsperado()
ClasseExistente metodoUtil()
Adaptador
21
Cliente
Alvo operacao()
ClasseExistente metodoUtil()
Cliente: aplicao que colabora com objetos aderentes interface Alvo Alvo: define a interface requerida pelo Cliente ClasseExistente: interface que requer adaptao Adaptador (Adapter): adapta a interface do Recurso interface Alvo
22
Adaptador operacao()
nica soluo se Alvo no for uma interface Java Adaptador possui referncia para objeto que ter sua interface adaptada (instncia de ClasseExistente). Cada mtodo de Alvo chama o(s) mtodo(s) correspondente(s) na interface adaptada.
23
public class ClienteExemplo { Alvo[] alvos = new Alvo[10]; public void inicializaAlvos() { alvos[0] = new AlvoExistente(); alvos[1] = new Adaptador(); // ... } public void executaAlvos() { for (int i = 0; i < alvos.length; i++) { alvo.operacao(); } } }
public class Adaptador extends ClasseExistente implements Alvo { public void operacao() { String texto = metodoUtilDois("Operao Realizada."); metodoUtilUm(texto); } } public class ClasseExistente { public void metodoUtilUm(String texto) { System.out.println(texto); } public String metodoUtilDois(String texto) { return texto.toUpperCase(); } } 24
public class ClienteExemplo { Alvo[] alvos = new Alvo[10]; public void inicializaAlvos() { alvos[0] = new AlvoExistente(); alvos[1] = new Adaptador(); // ... } public void executaAlvos() { for (int i = 0; i < alvos.length; i++) { alvos[i].operacao(); public abstract class Alvo { } public abstract void operacao(); } // ... resto da classe } } public class Adaptador extends Alvo { ClasseExistente existente = new ClasseExistente(); public void operacao() { String texto = existente.metodoUtilDois("Operao Realizada."); existente.metodoUtilUm(texto); } } public class ClasseExistente { public void metodoUtilUm(String texto) { System.out.println(texto); } public String metodoUtilDois(String texto) { return texto.toUpperCase(); } }
25
Quando usar?
Sempre que for necessrio adaptar uma interface para um cliente Class Adapter
Quando houver uma interface que permita a implementao esttica
Object Adapter
Quando menor acoplamento for desejado Quando o cliente no usa uma interface Java ou classe abstrata que possa ser estendida
26
27
2
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." [GoF]
28
Problema
Cliente
29
Estrutura de Faade
Cliente
30
Exemplo
InterfaceDeDados
Faade em Java
class Aplicao { ... Facade f; // Obtem instancia f f.registrar("Z", 123); f.comprar(223, 123); f.comprar(342, 123); f.fecharCompra(123); ... }
public class Facade { BancoDeDados banco = Sistema.obterBanco(); public void registrar(String nome, int id) { Cliente c = Cliente.create(nome, id); Carrinho c = Carrinho.create(); c.adicionarCarrinho(); } public void comprar(int prodID, int clienteID) { Cliente c = banco.selectCliente(cliente ID); Produto p = banco.selectProduto(prodID) { c.getCarrinho().adicionar(p); } public void fecharCompra(int clienteID) { Cliente c = banco.selectCliente(clienteID); double valor = c.getCarrinho.getTotal(); banco.processarPagamento(c, valor); } } public class Produto { static Produto create(String nome, int id,double preco) {...} double getPreco() {...} } public class BancoDeDados { Cliente selectCliente(int id) {...} Produto selectProduto(int id) {...} void processarPagamento() {...} } 32
public class Carrinho { static Carrinho create() {...} void adicionar(Produto p) {...} double getTotal() {...} }
public class Cliente { static Cliente create(String nome, int id) {...} void adicionarCarrinho(Carrinho c) {...} Carrinho getCarrinho() {...} }
Quando usar?
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
33
Nvel de acoplamento
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
Outra verso com menor isolamento (requer que aplicao-cliente conhea objeto Cliente)
Cliente joao = Cliente.create("Joo", 15); f.registrar(joao); // mtodo registrar(Cliente c)
34
Questes
Voc conhece algum exemplo de na API do J2SDK Onde voc criaria fachadas em uma aplicao Web J2EE? Voc saberia dizer qual a diferena entre Faade e Adapter
35
3
Composite
"Compor objetos em estruturas de rvore para representar hierarquias todo-parte. Composite permite que clientes tratem objetos individuais e composies de objetos de maneira uniforme." [GoF]
Problema
Cliente precisa tratar de maneira uniforme objetos individuais e composies desses objetos
Cliente
Rede
Rede
37
Soluo
* Componente
Individuo
Grupo
Individuo
38
Estrutura de Composite
:Composicao
:Composicao
:Folha
:Folha
:Folha
:Folha
:Folha
Cliente
Componente operacao()
1..*
39
Composite em Java
import java.util.*; public class MachineComposite extends MachineComponent { protected List components = new ArrayList(); public void add(MachineComponent component) { components.add(component); } public int getMachineCount() { // Exerccio public abstract class MachineComponent { } public abstract int getMachineCount(); } public String getName() { return name; } O que colocar no lugar public void setName(String name) { indicado para implementar this.name = name; } corretamente esta classe? } public abstract class Machine extends MachineComponent { public int getMachineCount() { // Exerccio } }
Fonte: [2]
40
Quando usar?
Sempre que houver necessidade de tratar um conjunto como um indivduo Funciona melhor se relacionamentos entre os objetos for uma rvore
Caso o relacionamento contenha ciclos, preciso tomar precaues adicionais para evitar loops infinitos, j que Composite depende de implementaes recursivas
Questes
Cite exemplos de Composite
Na API do J2SDK Em frameworks que voc conhece Em aplicaes que voc conhece
Instituio getMembros() 42
4
Bridge
"Desacoplar uma abstrao de sua implementao para que os dois possam variar independentemente." [GoF]
Problema (1)
Necessidade de um driver Exemplo: implementaes especficas para tratar objeto em diferentes meios persistentes
Publicao getTitulo() getAutor(id)
44
Problema (II)
Mas herana complica a implementao
Publicao getTitulo() getAutor(id)
Livro getISBN()
Revista getArtigo()
imp.getDados(this)
Implementador getDados(tipo)
PublicacaoImplBD getDados(tipo) Livro getISBN() getTitulo() getAutor() Revista getArtigo() getTitulo() getAutor(id) PublicacaoImplXML getDados(tipo)
46
Estrutura de Bridge
interface
Implementador implOperao()
imp.implOperao()
A Abstrao define operaes de nivel mais elevado baseadas nas operaes primitivas do Implementador
Quando usar?
Quando for necessrio evitar uma ligao permanente entre a interface e implementao Quando alteraes na implementao no puderem afetar clientes Quando tanto abstraes como implementaes precisarem ser capazes de suportar extenso atravs de herana Quando implementaes so compartilhadas entre objetos desconhecidos do cliente
48
Questes
Voc conhece alguma implementao de Bridge na API do J2SDK?
49
Bridge
Implementar um design que permita total desacoplamento entre interface e implementao
Faade
Simplificar o uso de uma coleo de objetos
Composite
Tratar composies e unidades uniformemente
50
Distribuio de responsabilidades
Os padres a seguir esto principalmente associados a atribuies especiais de responsabilidade
Singleton: centraliza a responsabilidade em uma nica instncia de uma classe Observer: desacopla um objeto do conhecimento de que outros objetos dependem dele Mediator: centraliza a responsabilidade em uma classe que determina como outros objetos interagem Proxy: assume a responsabilidade de outro objeto (intercepta) Chain of Responsibility: permite que uma requisio passe por uma corrente de objetos at encontrar um que a processe Flyweight: centraliza a responsabilidade em objetos compartilhados de alta granularidade (blocos de montagem)
51
5
Singleton
"Garantir que uma classe s tenha uma nica instncia, e prover um ponto de acesso global a ela." [GoF]
52
Problema
Garantir que apenas um objeto exista, independente do nmero de requisies que receber para cri-lo Aplicaes
Um nico banco de dados Um nico acesso ao arquivo de log Um nico objeto que representa um vdeo Uma nica fachada (Faade pattern)
Estrutura de Singleton
Objeto com acesso privativo Construtor privativo (nem subclasses tm acesso) Ponto de acesso simples, esttico e global
public static Singleton getInstancia() { if (instancia == null) { instancia = new Singleton(); } return instancia; }
Lazy initialization idiom Bloco deve ser synchronized* para evitar que dois objetos tentem criar o objeto ao mesmo tempo
(* omitido por falta de espao!) 54
Singleton em Java
public class Highlander { private Highlander() {} private static Highlander instancia = new Highlander(); public static synchronized Highlander obterInstancia() { return instancia; } } Esta classe implementa o design pattern Singleton
public class Fabrica { public static void main(String[] args) { Highlander h1, h2, h3; //h1 = new Highlander(); // nao compila! h2 = Highlander.obterInstancia(); h3 = Highlander.obterInstancia(); if (h2 == h3) { System.out.println("h2 e h3 so mesmo objeto!"); } } }
55
Prs e contras
Vantagens
Acesso central e extensvel a recursos e objetos
Desvantagens
Qualidade da implementao depende da linguagem Difcil de testar (simulaes dependem de instncia extra) Uso (abuso) como substituto para variveis globais Inicializao lazy "preguiosa" complicada em ambiente multithreaded ( um anti-pattern veja a seguir) Difcil ou impossvel de implementar em ambiente distribudo ( preciso garantir que cpias serializadas refiram-se ao mesmo objeto)
56
Esse famoso padro um truque para suportar inicializao lazy evitando o overhead da sincronizao
Parece uma soluo inteligente (evita sincronizao no acesso) Mas no funciona! Inicializao de resource (null) e instanciamento podem ser reordenados no cache
class SomeClass { private static Resource resource = null; public static Resource getResource() { if (resource == null) { synchronized (Resource.class) { if (resource == null) resource = new Resource(); } } return resource; } }
57
Alternativas
No usar lazy instantiation
Melhor alternativa (deixar otimizaes para depois)
private static final Resource resource = new Resource(); public static Resource getResource() { return resource; }
58
Questes
Cite aplicaes onde seria interessante usar um singleton? Questes extremas
Todos os objetos deveriam ser Singletons? Singletons so maus e no deviam ser usados?
59
6
Observer
"Definir uma dependncia um-para-muitos entre objetos para que quando um objeto mudar de estado, todos os seus dependentes sejam notificados e atualizados automaticamente." [GoF]
60
Observador 1 a 60 50 80 b 30 30 10 c 10 20 10
Observador 2
Problema
x y z
registra-se
Observador 1 a 60 50 80 b 30 30 10 1 c 10 20 10 c b a Observador 2
x y z
Observador 1 a 60 20 80 b 30 60 10 2 c 10 20 10
Observador 2
x y z
notifica
61
Problema (2)
Como garantir que objetos que dependem de outro objeto fiquem em dia com mudanas naquele objeto?
Como fazer com que os observadores tomem conhecimento do objeto de interesse? Como fazer com que o objeto de interesse atualize os observadores quando seu estado mudar?
Possveis riscos
Relacionamento (bidirecional) implica alto acoplamento. Como podemos eliminar o relacionamento bidirecional?
Cadastra-se
Observador
Notifica
Sujeito 62
Estrutura de Observer
interface 1..*
return dadosDoSujeito;
dadosObservados = concreto.getDados();
63
Seqncia de Observer
cliente a:ObservadorConcreto :SujeitoConcreto cadastrar(this)
create
b:ObservadorConcreto
cadastrar(b)
...
setDados(dados)
...
...
...
notificar()
64
Observer em Java
public void update(Observable o) { ObservableData data = (ObservableData) o; data.getData(); } public class ObservableData } extends Observable { private Object myData; public class Observable { List observers = new ArrayList(); public void add(Observer o) { observers.add(o); } public void remove(Observer o) { observers.remove(o); } public void notify() { Iterator it = observers.iterator(); while(it.hasNext()) { Observer o = (Observer)it.next(); o.update(this); } } } public void setData(Object myData) { this.myData = myData; notify(); } public Object getData() { return myData(); } }
create
Model()
create
:View
View(model) addListener(this)
create
:Controller
Controller(model, view)
addListener(this)
66
Seqncia de operao
Usurio aperta boto "Ao"
:Model :View :Controller
notificar()
processar() setEstado(s)
notificar()
processar()
atualizar()
getEstado()
67
Questes
Cite exemplos de implementaes de Observer e MVC
Na API Java Em frameworks que voc conhece
68
7
Mediator
"Definir um objeto que encapsula como um conjunto de objetos interagem. Mediator promove acoplamento fraco ao manter objetos que no se referem um ao outro explicitamente, permitindo variar sua interao independentemente." [GoF]
69
Problema
Como permitir que um grupo de objetos se comunique entre si sem que haja acoplamento entre eles? Como remover o forte acoplamento presente em relacionamentos muitos para muitos? Como permitir que novos participantes sejam ligados ao grupo facilmente?
Colaborador 1 Colaborador 2
Colaborador 3
70
Soluo
Introduzir um mediador
Objetos podem se comunicar sem se conhecer
Colaborador 1
Mediador
Colaborador 2
Colaborador 3
71
Estrutura de Mediator
mediador.operacaoMediada();
ColaboradorDois operacaoDois()
72
Descrio da soluo
Um objeto Mediador deve encapsular toda a comunicao entre um grupo de objetos
Cada objeto participante conhece o mediador mas ignora a existncia dos outros objetos O mediador conhece cada um dos objetos participantes
A interface do Mediador usada pelos colaboradores para iniciar a comunicao e receber notificaes
O mediador recebe requisies dos remetentes O mediador repassa as requisies aos destinatrios Toda a poltica de comunicao determinada pelo mediador (geralmente atravs de uma implementao concreta do mediador)
73
Questes
Onde voc usaria mediadores? Voc conhece exemplos de mediadores na API Java? Em frameworks?
74
8
Proxy
"Prover um substituto ou ponto atravs do qual um objeto possa controlar o acesso a outro." [GoF]
75
Problema
Sistema quer utilizar objeto real...
Creso
pergunta("Vou a guerra?")
Deus Apolo
Creso
pergunta("Vou a guerra?")
Orculo de Delfos
pergunta("Vou a guerra?")
Mesma interface!
Deus Apolo 76
interface
proxy.operacao()
SujeitoReal
Estrutura de Proxy
operacao() ...
Cliente usa intermedirio em vez de sujeito real Intermedirio suporta a mesma interface que sujeito real Intermedirio contm uma referncia para o sujeito real e repassa chamadas, possivelmente, acrescentando informaes ou filtrando dados no processo
77
Proxy em Java
public class Creso { ... Sujeito apolo = Fabrica.getSujeito(); apolo.operacao(); ... } public class SujeitoReal implements Sujeito { public Object operacao() { return coisaUtil; } } public class Intermediario implements Sujeito { private SujeitoReal real; public Object operacao() { cobraTaxa(); return real.operacao(); } } public interface Sujeito { public Object operacao(); } 78
Quando usar?
A aplicao mais comum em objetos distribudos Exemplo: RMI (e EJB)
O Stub proxy do cliente para o objeto remoto O Skeleton parte do proxy: cliente remoto chamado pelo Stub
RemoteInterface toUpper(String):String Cliente operacao() ObjetoRemoto toUpper(String):String
stub.toUpper("a")
Stub toUpper(String):String
Skeleton servico()
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?
80
9
Chain of Responsibility
"Evita acoplar o remetente de uma requisio ao seu destinatrio ao dar a mais de um objeto a chance de servir a requisio. Compe os objetos em cascata e passa a requisio pela corrente at que um objeto a sirva." [GoF]
81
10
Problema
Permitir que vrios objetos possam servir a uma requisio ou repass-la Permitir diviso de responsabilidades de forma transparente
5 50
receber() R$ 1,00
receber() R$ 0,05 82
Cliente
Processador processarRequisicao()
:Cliente
:Processador
:Processador
...
sucessor.processarRequisicao()
ProcessadorConcretoN processarRequisicao() 83
Questes
Cite exemplos de correntes de responsabilidade em
Aplicaes API Java
86
10
Flyweight
"Usar compartilhamento para suportar grandes quantidades de objetos refinados eficientemente." [GoF]
87
Problema
Pool de objetos imutveis compartilhados
88
if(flyweightPool.containsKey(id)) { return (Flyweight)flyweightMap.get(id); } else { Flyweight fly = new FlyweightConcreto( genKey() ); flyweightPool.put(fly.getKey(), fly); return fly; }
Estrutura de Flyweight
interface
Flyweight operacao(estadoMutavel)
Cliente 89
Prs e Contras
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)
90
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?
91
Observer
Quando houver necessidade de notificao automtica Para controlar a interao entre dois objetos independentes Quando for preciso um intermedirio para o objeto real Quando uma requisio puder ou precisar ser tratada por um ou mais entre vrios objetos Quando for necessrio reutilizar objetos visando performance (cuidado com o efeito oposto!)
92
Mediator Proxy
Questes
Qual a diferena entre
Observer e Mediator Flyweight e Composite Singleton e Faade Mediator e Proxy Chain of Responsibility e Adapter
93
11
Builder
"Separar a construo de um objeto complexo de sua representao para que o mesmo processo de construo possa criar representaes diferentes." [GoF]
96
Cliente
Cliente precisa de uma casa. Passa as informaes necessrias para seu diretor
Problema
Diretor
Utilizando as informaes passadas pelo cliente, ordena a criao da casa pelo construtor usando uma interface uniforme O construtor habilitado para construir qualquer objeto complexo (poderia, por exemplo, construir um prdio em vez de uma casa, caso o cliente tivesse indicado esse desejo)
ConstrutorDeCasas
ConstrutorDePredios
O Diretor selecionou um construtor de casas e chamou os passos necessrios da construo Quando o produto estiver pronto, o cliente pode buscar seu produto diretamente do construtor.
obterProduto() Cliente 97
Exemplo
Diretor construir()
1..*
ConstrutorDeCasas -resultadoFinal construirParteUm() construirParteDois() getCasa():Casa ConstrutorDePredios -resultadoFinal construirParteUm() construirParteDois() getPredio():Predio 98
Cliente
Exemplo: GoF
RTFReader parseRTF()
builder
create while (token = (Glyph)tokens.hasNext()){ switch token.type { CHAR: builder.convChar(token.Char) FONT: builder.convFontChange(token.Font) PARA: builder.convParagraph() } } create
TeXText
TextWidget
Client 99
Seqncia de Builder
cliente create create :Diretor :ConstrutorConcreto
construir() construirParteUm()
construirParteDois()
construirParteTres()
getResultados()
100
Quando usar?
Builder permite que uma classe se preocupe com apenas uma parte da construo de um objeto. til em algoritmos de construo complexos
Use-o quando o algoritmo para criar um objeto complexo precisar ser independente das partes que compem o objeto e da forma como o objeto construdo
Builder tambm suporta substituio dos construtores, permitindo que a mesma interface seja usada para construir representaes diferentes dos mesmos dados
Use quando o processo de construo precisar suportar representaes diferentes do objeto que est sendo construdo
101
Questes
Cite implementaes de Builder na API Java!
102
12
Factory Method
"Definir uma interface para criar um objeto mas deixar que subclasses decidam que classe instanciar. Factory Method permite que uma classe delegue a responsabilidade de instanciamento s subclasses." [GoF]
103
O acesso a um objeto concreto ser atravs da interface conhecida atravs de sua superclasse, mas cliente tambm no quer (ou no pode) saber qual implementao concreta est usando
Shape Client draw()
Problema
ShapeFactory Polygon draw()
Rectangle draw()
Circle draw()
neste contexto
public static Shape getShape(String type) { ShapeFactory factory = (ShapeFactory)typeMap.get(type); return factory.getShape(); // non-static Factory Method } 104
Como implementar?
possvel criar um objeto sem ter conhecimento algum de sua classe concreta?
Esse conhecimento deve estar em alguma parte do sistema, mas no precisa estar no cliente FactoryMethod define uma interface comum para criar objetos O objeto especfico determinado nas diferentes implementaes dessa interface O cliente do FactoryMethod precisa saber sobre implementaes concretas do objeto criador do produto desejado
105
ProdutoConcretoA metodo()
ShapeFactory getShape():Shape
Circle draw()
13
Abstract Factory
"Prover uma interface para criar famlias de objetos relacionados ou dependentes sem especificar suas classes concretas." [GoF]
108
Problema
Criar uma famlia de objetos relacionados sem conhecer suas classes concretas
Cliente
109
ProdutoUm operacaoUm()
ProdutoDois operacaoDois()
implA ProdutoConcretoUm
return new implA.ProdutoConcretoUm();
operacaoUm() FabricaConcretaA criarProdutoUm() criarProdutoDois() implB ProdutoConcretoUm operacaoUm() FabricaConcretaB ProdutoConcretoDois operacaoDois() 110 ProdutoConcretoDois operacaoDois()
criarProdutoUm() criarProdutoDois()
Questes
Cite exemplos de Abstract Factory no J2SDK Qual a diferena entre Factory Method e Abstract Factory?
111
14
Prototype
"Especificar os tipos de objetos a serem criados usando uma instncia como prottipo e criar novos objetos ao copiar este prottipo." [GoF]
112
Problema
Criar um objeto novo, mas aproveitar o estado previamente existente em outro objeto
new addXXX() setYYY()
clone()
113
Estrutura de Prototype
Cliente operacao() Prottipo clonar()
ProttipoConcretoUm clonar()
ProttipoConcretoUm clonar()
114
Resumo
O padro Prototype permite que um cliente crie novos objetos ao copiar objetos existentes Uma vantagem de criar objetos deste modo poder aproveitar o estado existente de um objeto Questo
Voc conhece alguma implementao de Prototype na API Java?
115
15
Memento
"Sem violar o encapsulamento, capturar e externalizar o estado interno de um objeto para que o objeto possa ter esse estado restaurado posteriormente." [GoF]
116
Problema
preciso guardar informaes sobre um objeto suficientes para desfazer uma operao, mas essas informaes no devem ser pblicas
Editor Grfico Editor Grfico Editor Grfico
Antes
Ao
Undo!
No funcionou!
Preciso de mais informao!
117
Soluo: Memento
Um memento um pequeno repositrio para guardar estado dos objetos
Pode-se usar outro objeto, um string, um arquivo
Quando usar?
Use Memento quando
Um snapshot do (parte do) estado de um objeto precisa ser armazenada para que ele possa ser restaurado ao seu estado original posteriormente Uma interface direta para se obter esse estado iria expor detalhes de implementao e quebrar o encapsulamento do objeto
119
Estrutura de Memento
Nunca opera sobre ou examina o contedo de um memento Cria um memento contendo snapshot de seu estado atual e usa o Memento para restaurar seu estado interno
Zelador
estado = m.getEStado()
Seqncia
:Zelador
criarMemento()
:Fonte
create
m:Memento
setEstado()
setMemento(m) getEstado()
121
Exemplo genrico
package memento; public class Fonte { private Memento memento; private Object estado; public Memento criarMemento() { return new Memento(); } public void setMemento(Memento m) { memento = m; } } package memento; public class Memento { private Object estado; Memento() { } void setEstado(Object estado) { this.estado = estado; } Object getEstado() { return estado; } }
Memento em Java
Implementar Memento em Java pode ser realizado simplesmente aplicando o encapsulamento de pacotes
Pacotes pequenos contendo apenas as classes que precisam compartilhar estado
122
Factory Method
Para isolar a classe concreta do produto criado da interface usada pelo cliente Para criar famlias inteiras de objetos que tm algo em comum sem especificar suas interfaces. Para criar objetos usando outro como base Para armazenar o estado de um objeto sem quebrar o encapsulamento. O uso tpico deste padro na implementao de operaes de Undo.
123
Memento
Introduo: operaes
Definies essenciais
Operao: especificao de um servio que pode ser requisitado por uma instncia de uma classe. Exemplo: operao toString() implementada em todas as classes. Mtodo: implementao de uma operao. Um mtodo tem uma assinatura. Exemplo: cada classe implementa toString() diferentemente Assinatura: descreve uma operao com um nome, parmetros e tipo de retorno. Exemplo: public String toString() Algoritmo: uma seqncia de instrues que aceita entradas e produz sada. Pode ser um mtodo, parte de um mtodo ou pode consistir de vrios mtodos.
124
16
Template Method
"Definir o esqueleto de um algoritmo dentro de uma operao, deixando alguns passos a serem preenchidos pelas subclasses. Template Method permite que suas subclasses redefinam certos passos de um algoritmo sem mudar sua estrutura." [GoF]
126
Classe
void concreto() {
Problema
Algoritmo
um() trs() dois() }
Algoritmos resultantes
Classe x = new ClasseConcretaUm() x.concreto()
Mtodos abstratos
ClasseConcretaUm
um() trs() dois()
ClasseConcretaDois
um() trs() dois()
127
Quando usar?
Quando a estrutura fixa de um algoritmo puder ser definida pela superclasse deixando certas partes para serem preenchidos por implementaes que podem variar
128
129
Exemplo no J2SDK
O mtodo Arrays.sort (java.util) um bom exemplo de Template Method. Ele recebe como parmetro um objeto do tipo Comparator que implementa um mtodo compare(a, b) e utiliza-o para definir as regras de ordenao
public class MedeCoisas implements Comparator<Coisa> { public int compare(Coisa c1, Coisa c2) { if (c1.getID() > c2.getID()) return 1; if (c1.getID() < c2.getID()) return -1; if (c1.getID() == c2.getID()) return 0; } }
Coisa id: int
... Coisa coisas[] = new Coisa[10]; coisas[0] = new Coisa("A"); coisas[1] = new Coisa("B"); ... Arrays.sort(coisas, new MedeCoisas()); ...
130
Questes
Cite outros exemplos de Template Method
Em Java Em frameworks
131
17
State
"Permitir a um objeto alterar o seu comportamento quanto o seu estado interno mudar. O objeto ir aparentar mudar de classe." [GoF]
132
Problema
Desconectado :Objeto operao
if (estado == desconectado) { faaIsto(); } else if (estado == conectado) { faaAquilo(); } else { faa(); }
Conectado
Transmitindo
operao
estado.faa()
Objetivo: usar objetos para representar estados e polimorfismo para tornar a execuo de tarefas dependentes de estado transparentes
133
Exemplo [GoF]
TCPConnection open() close() acknowldge() TCPState open() close() acknowldge()
state
state.open()
Sempre que a aplicao mudar de estado, o objeto TCPConnection muda o objeto TCPState que est usando
134
Estrutura de State
Contexto estado:Estado requisicao()
interface
Estado processar()
estado.processar()
EstadoConcretoUm processar()
EstadoConcretoDois processar()
...
Contexto: Estado
define a interface de interesse aos clientes mantm uma instncia de um EstadoConcreto que define o estado atual define uma interface para encapsular o comportamento associado com um estado particular do contexto Implementa um comportamento associado ao estado do contexto
135
EstadoConcreto
State em Java
public class GatoQuantico { public final Estado VIVO = new EstadoVivo(); public final Estado MORTO = new EstadoMorto(); public final Estado QUANTICO = new EstadoQuantico(); private Estado estado; public void setEstado(Estado estado) { this.estado = estado; } public class EstadoVivo { public void miar() { public void miar() { System.out.println("Meaaaooww!!"); estado.miar(); } } }
public interface Estado { void miar(); } public class EstadoMorto { public void miar() { System.out.println("Buu!"); } } public class EstadoQuantico { public void miar() { System.out.println("Hello Arnold!"); } } 136
18
Strategy
"Definir uma famlia de algoritmos, encapsular cada um, e faz-los intercambiveis. Strategy permite que algoritmos mudem independentemente entre clientes que os utilizam." [GoF]
137
Problema
Vrias estratgias, escolhidas de acordo com opes ou condies
if (guerra && inflao > META) { doPlanoB(); else if (guerra && recesso) { doPlanoC(); } else { doPlanejado(); } plano.executar(); } if (guerra && inflao > META) { plano = new Estrategia_C(); } else if (guerra && recesso) { plano = new Estrategia_B(); } else { plano = new Estrategia_A();
Estratgia executar();
Estratgia_B executar();
Estrutura de Strategy
Contexto strat:Estrategia requisicao()
interface
Estrategia executarAlgoritmo()
strat.executarAlgoritmo() ...
EstrategiaConcretaUm executarAlgoritmo()
EstrategiaConcretaDois executarAlgoritmo()
...
Um contexto repassa requisies de seus clientes para sua estratgia. Clientes geralmente criam e passam uma EstategiaConcreta para o contexto. Depois, clientes interagem apenas com o contexto Estrategia e Contexto interagem para implementar o algoritmo escolhido. Um contexto pode passar todos os dados necessrios ou uma cpia de si prprio
139
Quando usar?
Quando classes relacionadas forem diferentes apenas no seu comportamento
Strategy oferece um meio para configurar a classe com um entre vrios comportamentos
Quando voc precisar de diferentes variaes de um mesmo algoritmo Quando um algoritmo usa dados que o cliente no deve conhecer Quando uma classe define muitos comportamentos, e estes aparecem como mltiplas declaraes condicionais em suas operaes
140
public class Guerra { Estrategia acao; public void definirEstrategia() { if (inimigo.exercito() > 10000) { acao = new AliancaVizinho(); } else if (inimigo.isNuclear()) { acao = new Diplomacia(); } else if (inimigo.hasNoChance()) { acao = new AtacarSozinho(); } } public void declararGuerra() { acao.atacar(); } public void encerrarGuerra() { acao.concluir(); } } public class AliancaVizinho implements Estrategia { public void atacar() { vizinhoPeloNorte(); atacarPeloSul(); ... } public void concluir() { dividirBeneficios(...); dividirReconstruo(...); } }
Strategy em Java
public interface Estrategia { public void atacar(); public void concluir(); } public class AtacarSozinho implements Estrategia { public void atacar() { plantarEvidenciasFalsas(); soltarBombas(); derrubarGoverno(); } public void concluir() { estabelecerGovernoAmigo(); } }
public class Diplomacia implements Estrategia { public void atacar() { recuarTropas(); proporCooperacaoEconomica(); ... } public void concluir() { desarmarInimigo(); } }
141
Questes
Cite exemplos de Strategy Qual a diferena entre Strategy e State?
142
19
Command
"Encapsular uma requisio como um objeto, permitindo que clientes parametrizem diferentes requisies, filas ou requisies de log, e suportar operaes reversveis." [GoF]
143
Problema
new edit del get all all Cliente Aplicao Complexa
Command c = getCommand("all");
144
Estrutura de Command
Executor cmd:Comando servio() Comando executar()
cmd.executar() ...
ComandoConcretoUm Cliente
cria
estado executar()
receptor.ao()
Command em Java
public interface Command { public Object execute(Object arg); } public interface NewCommand implements Command { public NewCommand(Database db) { this.db = db; } public Object execute(Object arg) { Data d = (Data)arg; int id = d.getArg(0); String nome = d.getArg(1); db.insert(new Member(id, nome)); } } private void initCommands() { cmds.put("new", new NewCommand(db)); cmds.put("del", new DeleteCommand(db)); ... } public void service(String cmd, Object data) { ... Command c = (Command)cmds.get(cmd); ... Object result = c.execute(data); ... } } }
public class Server { private Database db = ...; private HashMap cmds = new HashMap(); public Server() { initCommands(); }
public class DeleteCommand implements Command { public DeleteCommand(Database db) { this.db = db; } public Object execute(Object arg) { Data d = (Data)arg; int id = d.getArg(0); db.delete(id); }
146
Questes
Cite exemplos de Command
Na API Java Em frameworks
147
20
Interpreter
"Dada uma linguagem, definir uma representao para sua gramtica junto com um interpretador que usa a representao para interpretar sentenas na linguagem." [GoF]
149
Problema
Se comandos esto representados como objetos, eles podero fazer parte de algoritmos maiores
Vrios padres repetitivos podem surgir nesses algoritmos Operaes como iterao ou condicionais podem ser frequentes: represent-las como objetos Command
Soluo em OO: elaborar uma gramtica para calcular expresses compostas por objetos
Interpreter uma extenso do padro Command (ou um tipo de Command; ou uma micro-arquitetura construda com base em Commands) em que toda uma lgica de cdigo pode ser implementada com objetos
150
Exemplo [GoF]
RegularExpression interpret()
SequenceExpression interpret()
expr1 expr2
alternative1
RepetitionExpression interpret()
AlternationExpression interpret()
alternative2
151
Questes
Qual a diferena entre Command e Interpreter? Cite exemplos de implementaes na API Java e em frameworks que voc conhece
152
State
Para representar o estado de um objeto
Strategy
Para representar um algoritmo (comportamento)
Command
Para representar um comando (ao imperativa do cliente)
Interpreter
Para realizar composio com comandos e desenvolver uma linguagem de programao usando objetos
153
Introduo: Extenso
Extenso a adio de uma classe, interface ou mtodo a uma base de cdigo existente [2] Formas de extenso
Herana (criao de novas classes) Delegao (para herdar de duas classes, pode-se estender uma classe e usar delegao para "herdar" o comportamento da outra classe)
ClasseDerivada
interface
155
Alm da extenso
Tanto herana como delegao exigem que se saiba, em tempo de compilao, que comportamentos so desejados. Os patterns permitem acrescentar comportamentos em um objeto sem mudar sua classe Principais classes
Command (captulo anterior) Template Method (captulo anterior) Decorator: adiciona responsabilidades a um objeto dinamicamente. Iterator: oferece uma maneira de acessar uma coleo de instncias de uma classe carregada. Visitor: permite a adio de novas operaes a uma classe sem mudar a classe.
156
21
Decorator
"Anexar responsabilidades adicionais a um objeto dinamicamente. Decorators oferecem uma alternativa flexvel ao uso de herana para estender uma funcionalidade." [GoF]
157
Requisio
Problema
Requisio
getResultado()
getX()
getResultado()
158
Estrutura de Decorator
Componente operao()
ComponenteConcreto operao()
Decorador operao()
componente.operao();
super.operao(); comportamentoAdicional();
159
public abstract class DecoradorConcretoUm extends Decorador { public DecoradorConcretoUm (Componente componente) { super(componente); } public String getDadosComoString() { return getDados().toString(); public abstract class DecoradorConcretoUm } extends Decorador { private Object transformar(Object o) { private Object estado; ... public DecoradorConcretoUm (Componente comp, } Object estado) { public Object getDados() { super(comp); return transformar(getDados()); this.estado = estado; } } public void operacao(Object arg) { ... // ... comportamento adicional public void operacao(Object arg) { componente.operacao(arg); // ... comportamento adicional } super.operacao(estado); } // ... } }
Decorator em Java
public class ComponenteConcreto implements Componente { private Object dados; public Object getDados() { public abstract class Decorador implements Componente { return dados; private Componente componente; } public Decorador(Componente componente) { public void operacao(Object arg) { this.componente = componente; ... } } public Object getDados() { } return componente.getDados(); } public interface Componente { public void operacao(Object arg) { Object getDados(); componente.operacao(arg); void operacao(Object arg); } } } 160
// objeto do tipo File File tanque = new File("agua.txt"); // componente FileInputStream // cano conectado no tanque FileInputStream cano = new FileInputStream(tanque); // read() l um byte a partir do cano byte octeto = cano.read();
161
Concatenao do decorador
Comportamento adicional
162
Questes
Cite outros exemplos de Decorator no J2SDK e em frameworks que voc conhece
163
22
Iterator
"Prover uma maneira de acessar os elementos de um objeto agregado seqencialmente sem expor sua representao interna." [GoF]
164
Problema
Tipo de referncia genrico
Object o = iterator.next()
Iterator
Coleo arbitrria de objetos (array, hashmap, lista, conjunto, pilha, tabela, ...)
iterator.hasNext() ?
produz
Iterator
tem
Coleo 165
Questes
Quantos iterators voc conhece nas APIs da linguagem Java (alm de java.util.Iterator)?
167
23
Visitor
"Representar uma operao a ser realizada sobre os elementos de uma estrutura de objetos. Visitor permite definir uma nova operao sem mudar as classes dos elementos nos quais opera." [GoF]
168
Problema
Operaes fixas
Cliente
Interface
Antes
Depois
Node accept(NodeVisitor)
v.visit(this)
AssignmentNode accept(NodeVisitor v)
v.visit(this)
Estrutura de Visitor
Cliente
interface
v.visitarA(this)
v.visitarB(this)
172
Diagrama de seqncia
:EstruturaDeObjetos :ElementoConcretoA :ElementoConcretoB :VisitanteConcreto
aceitar(:Visitante) visitarA(:ElementoConcretoA)
operacaoA()
aceitar(:Visitante) visitarB(:ElementoConcretoB)
operacaoB()
173
174
public interface Visitante { public Object visitar(Planilha p); public Object visitar(Texto t); public Object visitar(Grafico g); } public class GerarHTML implements Visitante { public Object visitar(Planilha p) { p.gerarHTML(); return null; } public Object visitar(Texto t) { t.gerarHTML(); return null; } public Object visitar(Grafico g) { g.gerarPNG(); } } public class Validar implements Visitante { public Object visitar(Planilha p) { return new Boolean(true); } public Object visitar(Texto t) { return new Boolean(true); } public Object visitar(Grafico g) { return new Boolean(true); } } public class Cliente { public static void main(String[] args) { Documento doc = new Texto(); doc.aceitar(new GerarTexto()); doc.aceitar(new GerarHTML()); if (((Boolean)doc.aceitar( new Validar())).booleanValue()) { System.out.println(doc + " valido!"); } } }
Prs e contras
Vantagens
Facilita a adio de novas operaes Agrupa operaes relacionadas e separa operaes no relacionadas: reduz espalhamento de funcionalidades e embaralhamento
Desvantagens
D trabalho adicionar novos elementos na hierarquia: requer alteraes em todos os Visitors. Se a estrutura muda com frequncia, no use! Quebra de encapsulamento: mtodos e dados usados pelo visitor tm de estar acessveis
Iterator
Para navegar em uma coleo elemento por elemento
Visitor
Para estender uma aplicao com novas operaes sem que seja necessrio mexer na interface existente.
177
178
Padres GRASP
Padres bsicos Information Expert Creator High Cohesion Low Coupling Controller Padres avanados Polymorphism Pure Fabrication Indirection Protected Variations
Padres GRASP refletem prticas mais pontuais da aplicao de tcnicas OO Padres GoF exploram solues mais especficas Padres GRASP ocorrem na implementao de vrios padres GoF
179
Soluo
Atribuir uma responsabilidade ao especialista de informao: classe que possui a informao necessria para cumpri-la Comece a atribuio de responsabilidades ao declarar claramente a responsabilidade
180
Expert
No sistema abaixo, uma classe precisa saber o total geral de uma venda (Sale). Que classe deve ser a responsvel?
Sale possui informaes sobre SalesLineItems (knowing)
Fonte: [4]
181
Expert (2)
A nova responsabilidade conduzida por uma operao no driagrama de interao Um novo mtodo criado
Fonte: [4]
182
Expert(3)
Mas como a classe Sale vai calcular o valor total? Somando os subtotais. Mas quem faz isto? A responsabilidade para cada subtotal atribuda ao objeto SalesLineItem (item de linha do pedido)
183
Expert (4)
O subtotal depende do preo. O objeto ProductSpecification o especialista que conhece o preo, portanto a responsabilidade dele.
184
Creator
Problema: Que classe deve ser responsvel pela criao de uma nova instncia de uma classe? Soluo: Atribua a B a responsabilidade de criar A se:
B agrega A objetos B contm A objetos B guarda instncias de A objetos B faz uso de A objetos B possui dados para inicializao que ser passado para A quando ele for criado.
185
Creator
Que classe deve ser responsvel por criar uma instncia do objeto SalesLineItem abaixo?
Sale agrega muitos SalesLineItems
186
Creator
A nova responsabilidade conduzida por uma operao em um diagrama de interaes
Um novo mtodo criado na classe de design para expressar isto.
Fonte: [4]
187
High Cohesion
Problema
Como manter a complexidade sob controle? Classes que fazem muitas tarefas no relacionadas so mais difceis de entender, de manter e de reusar, alm de serem mais vulnerveis mudana.
Soluo
Atribuir uma responsabilidade para que a coeso se mantenha alta.
Voc sabe o que coeso?
188
Coeso
Coeso [Funcional]
Uma medida de quo relacionadas ou focadas esto as responsabilidades de um elemento.
Exemplo
Uma classe Co coesa se tem operaes relacionadas ao Co (morder, correr, comer, latir) e apenas ao Co (no ter por exemplo, validar, imprimirCao, listarCaes) Alta coeso promove design modular
189
High Cohesion
Que classe responsvel por criar um pagamento (Payment) e associ-lo a uma venda (Sale)?
Register assumiu responsabilidade por uma coisa que parte de Sale (fazer um pagamento no responsabilidade de registrar)
190
High Cohesion
Nesta soluo, Register delega a responsabilidade a Sale, diminuindo aumentando a coeso de Register
A criao do processo de pagamento agora responsabilidade da venda e no do registro. Faz mais sentido pois o pagamento parte de Sale.
191
Soluo
Atribuir uma responsabilidade para que o acoplamento mantenha-se fraco.
Acoplamento
uma medida de quanto um elemento est conectado a, ou depende de outros elementos Uma classe com acoplamento forte depende de muitas outras classes: tais classes podem ser indesejveis O acoplamento est associado coeso: maior coeso, menor acoplamento e vice-versa.
192
Low Coupling
Como devemos atribuir uma responsabilidade para criar Payment e associ-lo com Sale?
Payment
Register
Sale
193
Low Coupling
Qual das opes abaixo suporta o menor acoplamento?
Opo 1
Opo 2
194
Controller
Problema
Quem deve ser o responsvel por lidar com um evento de uma interface de entrada?
Soluo
Atribuir responsabilidades para receber ou lidar com um evento do sistema para uma classe que representa todo o sistema (controlador de fachada front controller), um subsistema e um cenrio de caso de uso (controlador de caso de uso ou de sesso).
Controller
Um sistema contendo operaes de sistema associados com eventos do sistema.
196
Controller: problema
197
Controller: soluo
A primeira soluo representa o sistema inteiro A segunda soluo representa o destinatrio ou handler de todos os eventos de um caso de uso
O diagrama acima no mostra o Controller, mas a transparncia da comunicao (chamada do cliente, objeto que recebe a mensagem)
198
Outros padres
Padres GRASP avanados Domine primeiro os cinco bsicos antes de explorar estes quatro:
Polymorphism Indirection Pure Fabrication Protected Variations
Outros padres
Dependency Injection (aplicao de Indirection) Aspectos
199
GRASP: Polymorphism
Problema:
Como lidar com alternativas baseadas no tipo? Como criar componentes de software plugveis? Deseja-se evitar variao condicional (if-then-else): pouco extensvel. Deseja-se substituir um componente por outro sem afetar o cliente.
Soluo
No use lgica condicional para realizar alternativas diferentes baseadas em tipo. Atribua responsabilidades ao comportamento usando operaes polimrficas Refatore!
200
Soluo
Atribuir um conjunto altamente coesivo de responsabilidades a uma classe artificial que no representa um conceito do domnio do problema.
201
Soluo
Identificar pontos de variao ou instabilidade potenciais. Atribuir responsabilidades para criar uma interface estvel em volta desses pontos. Encapsulamento, interfaces, polimorfismo, indireo e padres; mquinas virtuais e brokers so motivados por este princpio Evite enviar mensagens a objetos muito distantes.
202
GRASP: Indirection
Problema
Onde atribuir uma responsabilidade para evitar acoplamento direto entre duas ou mais coisas? Como desacoplar objetos para que seja possvel suportar baixo acoplamento e manter elevado o potencial de reuso? Atribua a responsabilidade a um objeto intermedirio para mediar as mensagens entre outros componentes ou servios para que no sejam diretamente acoplados. O objeto intermedirio cria uma camada de indireo entre os dois componentes que no mais dependem um do outro: agora ambos dependem da indireo.
Soluo
203
Injeo de dependncias
(inverso de controle)
Use
A
inteface
InterB
A depende de uma interface IB B depende de uma interface IB A recebe implementao de B quando criado
InterB
inteface
SimulatedB
InterB
Dependency Injection
Problema
Controle convencional: o prprio objeto cria ou localiza suas dependncias: acoplamento!
ProgramadorJava nome: String certificacao:CertificacaoProgramadorJava inscrever(): Certificado JNDI new CertificacaoProgramadorJava() CertificacaoProgramadorJava lookup(certificacaoSCEA)
CertificacaoArquitetoJ2EE
206
207
A dependncia
1:package faculdade; 2: 3:public class CertificacaoProgramadorJava { 4: public CertificacaoProgramadorJava() {} 5: public Certificado iniciarTeste() throws NaoAprovadoException { 6: Certificado certificado = null; 7: // Realizar questoes 8: 9: return certificado; 10: } 11:}
208
Diminuindo o acoplamento
Melhor forma de eliminar acoplamento usar interfaces
Implementao dependente da interface Cliente depende da interface, e no mais da implementao
3:public interface Certificacao { 4: public Object iniciarTeste() throws CertificacaoException; 5:} 3:public class CertificacaoProgramadorJava implements Certificacao { 4: public CertificacaoProgramadorJava() {} 5: public Object iniciarTeste() throws NaoAprovadoException { 6: Certificado certificado = new Certificado(); 7: // Realizar questoes 8: certificado.setNota(90); 9: 10: return certificado; 11: } 12:}
209
Soluo
Em vez do programador buscar ou criar sua prpria certificao, ela atribuda a ele
Para isto, deve haver mtodo para criar a associao
ProgramadorJava nome: String certificacao:CertificacaoProgramadorJava inscrever(): Certificado setCertificacao(Certificacao); programador.setCertificacao(this) CertificacaoArquitetoJ2EE Certificacao
programador.setCertificacao(certJ2EE) CertificacaoProgramadorJava
210
Inverso de controle
public interface Programador { public Object inscrever() throws NaoAprovadoException; } 3:public class ProgramadorJava implements Programador { 4: private String nome; 5: private CertificacaoProgramadorJava certificacao; 6: 7: public ProgramadorJava(String nome) { 8: this.nome = nome; 9: } 10: 11: public Object inscrever() throws NaoAprovadoException { 12: return certificacao.iniciarTeste(); 13: } 14: 15: public void setCertificacao(Certificacao certificacao) { 16: this.certificacao = certificacao; 17: } 18:}
211
212
Tipos de interesse
Usando uma linguagem orientada a objetos, pode-se representar de forma eficiente e modular as classes e procedimentos Outros interesses so implementados como partes de classes e partes ou composio de procedimentos
Caractersticas mover() e desenhar() poderiam ser reutilizadas em outros objetos
Figura
mover() desenhar()
Retngulo
mover() desenhar()
Crculo
mover() desenhar()
Tringulo
mover() desenhar()
mover() validarCoords() // cdigo p/ mover logarAcao() desenhar() // cdigo p/ desenhar logarAcao() 213
Tangling: cdigo para implementar o requerimento se mistura com lgica do cdigo existente 214
package veiculos.versao2; public class VeiculoCarga2 extends veiculos.VeiculoCarga { public void abastecer() { super.abastecer() + diesel; Logger.log(nome() + " abastecido com diesel"); } public Apolice segurar() {...} } 216
Crculo
colorir()
Crculo
desenhar()
Crculo
mover()
Crculo
mover()
Crculo
colorir() desenhar() mover() valida coordenadas antes de mover
218
Hyperslices
Encapsulam interesses
Hypermodule
Conjunto de hyperslices e relacionamentos de integrao (informam como hyperslices se relacionam entre si)
Crculo Retangulo Triangulo mover() mover() mover() Crculo Retangulo Triangulo mover() mover() mover() Circulo Retngulo Tringulo
Classe
Validao
Aspecto
...
Uso de aspectos
Antes
Cliente Cliente
Depois
Isto feito usando wildcards sem introduzir cdigo no objeto
ObjetoImpl bm.start()
Proxy mtodo()
mtodo() bm.stop()
220
Concluses
Neste minicurso, introduzimos diversos padres usados em aplicaes OO
Padres clssicos GoF, que descrevem solues para problemas comuns, elaborados Padres GRASP, que descrevem aplicao de princpios OO Padres e prticas emergentes como injeo de dependncias (aplicao de uma prtica GRASP) e aspectos (extenso do OO)
Aprenda a usar os padres clssicos e encurte o tempo para ganhar tornar-se um programador experiente! Vrios outros padres existem e sero inventados
Alguns sobrevivero por muito tempo, outros no Catalogue suas solues e crie seus prprios padres!
221
Fontes
[1][Metsker] Steven
John Metsker, Design Patterns Java Workbook. Addison-Wesley, 2002, [2][GoF] Erich Gamma et al. Design Patterns: Elements of Reusable Object-oriented Software. Addison-Wesley, 1994 [3] James W. Cooper. The Design Patterns Java Companion. http://www.patterndepot.com/put/8/JavaPatterns.htm [4][Larman] Craig Larman, Applying UML and Patterns, 2nd. Edition, Prentice-Hall, 2002 [5][EJ] Joshua Bloch, Effective Java Programming Guide, AddisonWesley, 2001 [6][JMM FAQ] Jeremy Manson and Brian Goetz, JSR 133 (Java Memory Model) FAQ, Feb 2004
222
www.argonavis.com.br
2003, 2005, Helder da Rocha (helder.darocha@gmail.com)