Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Formulário para Descrição de Padrões
Nome e Classificação
Intenção
Também Conhecido
Como
Motivação
Aplicabilidade
Estrutura
Participantes
Colaboradores
Conseqüências
Implementação
Exemplo de Código
Usos Conhecidos
Padrões
Relacionados
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Notação de Classes e Objetos
ClasseAbstrata
operaçãoAbstrata()
SubclasseConcreta1
operação()
variávelDeInstância
referencia objeto
agrega
cria
pseudo código
ClasseConcreta
um
muitos
umObjeto
referênciaAObjeto
outroObjeto
variávelDeInstância
SubclasseConcreta2
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Diagrama de Interação de Objetos
umObjeto
operação a
ti
v
a
sobre
o
ob
jet
o
TEMPO
outroObjeto.método()
this.método()
outroObjeto
outroObjeto = new Objeto()
(instanciação)
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais(1/2)
Tratam de algoritmos e como atribuir responsabilidades entre
objetos
ChainOf
Responsibility
exec
Command
new
exec()
Interpreter
&
|
b
c
a
*
Iterator
Mediator
Memento
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Observer(s)
30%, 20%, 50%
Padrões Comportamentais(2/2)
Tratam de algoritmos e como atribuir responsabilidades entre
objetos
Visitor
State
Strategy
a() b()
a()
b()
TemplateMethod()
a(..);
...
b(..);
Visitor
Visitor
30%, 10%, 60%
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Enquanto se concentram apenas na
forma como os objetos são conectados,
criam complexos fluxos de controle que
são difíceis de seguir em runtime.
De Classe
baseados no uso de herança
De Objeto
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Chain of Responsibility
- Encadeamento de
Atendentes
Command - Comando
Interpreter
-Interpretador
Iterator - Iterador
Mediator - Mediador
Memento - Lembrança
Observer - Observador
State - Estado
Strategy - Estratégia
Template Method
-Esqueleto de Método
Visitor - Visitante
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Chain of Responsibility - Encadeamento de
Atendentes
(Objeto) Evita acoplamento entre solicitantes e
atendentes permitindo que mais de um objeto tenha chance de
tratar da solicitação. Encadeia os atendentes e passa a solicitação
através desta cadeia até que algum deles a trate.
Command - Comando
(Objeto) Encapsula uma solicitação no
interior de um objeto, permitindo que se parametrize clientes com
diferentes solicitações, filas ou registros de solicitações, suportando
ainda o cancelamento de solicitações.
Interpreter - Interpretador
(Classe) Dada uma linguagem,
cria uma representação para a gramática da linguagem, juntamente
com um interpretador que utilizar esta representação para
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Iterator - Iterador
(Objeto) Provê uma forma de acessar
seqüencialmente os elementos de um agregado de objetos, sem
expor a representação interna deste agregado.
Mediator - Mediador
(Objeto) Define um objeto que encapsula
o modo como um conjunto de objetos interage. Promove um
acoplamento fraco entre objetos, evitando que referenciem
diretamente um ao outro e permitindo que se possa variar a
interação entre eles de modo independente.
Memento - Lembrança
(Objeto) Sem violar encapsulamento,
captura e armazena externamente o estado de um objeto, de modo
que o estado anterior de um objeto possa ser posteriormente
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Observer - Observador
(Objeto) Define uma dependência
1-para-n entres objetos, de modo que quando o estado de um objeto
é alterado todos seus dependentes são notificados e atualizados
automaticamente.
State - Estado
(Objeto) Permite que um objeto altere seu
comportamento quando seu estado interno se modifica. O objeto
parecerá ter mudado de classe.
Strategy - Estratégia
(Objeto) Define uma família de
algoritmos, encapsula cada um, e os faz inter-cambiáveis. Permite
que o algoritmo varie independentemente dos clientes que o
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrões Comportamentais
Template Method - Esqueleto de Método
(Classe)
Define o esqueleto de um algoritmo através de uma operação,
deixando que subclasses refinem o restante do algoritmo.
Permitem que subclasses redefinam certos aspectos de um
algoritmo sem modificar a estrutura do algoritmo.
Visitor - Visitante
(Objeto) Representa uma operação a ser
executada sobre os elementos da estrutura de um objeto.
Visitantes permitem que se definam novas operações sem
modificar as classes dos elementos sobre as quais ele atua.
Chain of Responsibility
ChainOf
Responsibility
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Chain of Responsibility
Intenção
Evita acoplamento entre solicitantes e atendentes permitindo
que mais de um objeto tenha chance de tratar da solicitação.
Encadeia os atendentes e passa a solicitação através desta
cadeia até que algum deles a trate.
Motivação
Considere, por exemplo, a construção de um conjunto de helps
(auxílios) em uma GUI.
Suponha que o usuário possa obter auxílio a partir de qualquer parte
da interface pressionnando, F1. O help deve então ser sensível ao
contexto onde foi ativado.
Nestes casos torna-se natural criar vários níveis de auxílio, se aplicando
da situação mais específica à mais geral.
Quando o contexto mais específico não dispuser de auxílio, o contexto
de auxílio imediatamente superior deve ser ativado.
A idéia do padrão é facilitar o desacoplamento entre o solicitante
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Client
Handler
handleRequest()
ConcreteHandler2
handleRequest()
Padrão
Chain of Responsibility
Estrutura e Participantes
ConcreteHandler1
handleRequest()
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Chain of Responsibility
Aplicabilidade
Use o Padrão quando:
Mais de um objeto pode tratar de um pedido, e o tratador de
pedidos (handler) não é conhecido a priori. O handler deve ser
buscado automaticamente de forma ascendente.
Você quer emitir um pedido para um de vários objetos sem
especificar o recebedor de forma explícita.
O conjunto de objetos que pode tratar de um pedido deve ser
configurado dinamicamente.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Chain of Responsibility
Conseqüências
Acoplamento reduzido
Evita que um objeto (client) seja forçado a tomar conhecimento
do outro (handler)
O objeto só precisa saber que o pedido foi tratado
apropriadamente
A estrutura da cadeia não precisa ser conhecida
Flexibilidade na atribuição de responsabilidades para
objetos (subclasses, alteração dinâmica da cadeia)
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Chain of Responsibility
Exercícios
Observe os trechos de código das próximas 2 páginas e
veja como funciona a Chain of Responsibility do
tratamento de eventos no AWT 1.0.
Veja também detalhes do código fonte das classes
Component
Class Component {
..
public boolean postEvent(Event e) {
if (handleEvent(e)) {
e.consume();
return true;
}
Component parent = this.parent;
...
if (parent != null) { ...
if (parent.postEvent(e)) {
e.consume();
return true;
}
}
return false;
}
}
public class BancoApplet extends Applet {
Button clientesButton, contasButton, crediteButton, debiteButton;
public boolean handleEvent(Event evt) {
if (evt.id == Event.ACTION_EVENT) {
if (evt.target == clientesButton) {
...
} else if (evt.target == contasButton) {
...
} else if (evt.target == crediteButton) {
...
} else if (evt.target == debiteButton) {
...
}
} else {
return super.handleEvent(evt);
}
}
}
Command
exec
Command
new
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Command
Intenção
Encapsula uma solicitação no interior de um objeto, permitindo que se
parametrize clientes com diferentes solicitações, filas ou registros de
solicitações, suportando ainda o cancelamento de solicitações.
Motivação
Algumas vezes é necessário se fazer uma solicitação de serviço
sem conhecimento algum do tipo de operação que está sendo
requerida.
Na construção de um menu, por exemplo.
O padrão Command permite que um menu possa solicitar
execução de pedidos sem conhecer a natureza destes pedidos,
pois o próprio objeto encapsula os detalhes da execução do
pedido.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
receiver.action();
Client
Receiver
action()
ConcreteCommand
execute()
Command
execute()
Padrão
Command
Estrutura e Participantes
state
Invoker
receiver
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Command
Colaborações
anInvoker
aCommand
aClient
aReceiver
aCommand = new Command
StoreCommand(aCommand)
execute()
action()
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Command
Aplicabilidade
Parametrizar objetos com uma ação a executar.
Tal parametrização pode ser feita com funções de callback em
linguagens imperativas. Comandos são um substituto orientado a
objetos para callbacks.
Especificar, armazenar e executar pedidos em
momentos diferentes.
Commands podem ser transferidos entre espaços de endereçamento e
máquinas.
Suportar undo
A operação execute pode armazenar o estado para reverter os efeitos
do próprio comando.
Suportar ‘logs’ de modificações
Através da inclusão de undoable Commands em meio persistente.
Estruturar um sistema em torno de operações de alto
nível
Constituídas internamente por várias operações primitivas. Facilidades
para extensão do sistema.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Command
Conseqüências
Desacoplamento do objeto que invoca uma operação,
do outro que executa esta operação
Comandos são objetos, e como tal podem ser
manipulados e refinados.
Comandos podem ser compostos, criando
MacroCommands
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Command
Exercícios
Veja a capacidade de suporte à implementação dinâmica
do padrão Command dentro dos pacotes java.lang e
java.lang.reflect
Class java.lang.Class
⌧
Method[] getMethods();
Classe java.lang.reflect.Method
⌧
Object invoke(Object target, Object[] args);
Interpreter
Interpreter
&
|
b
c
a
*
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão Interpreter
Intenção
Dada uma linguagem, cria uma representação para a gramática da
linguagem, juntamente com um interpretador que utilizar esta
representação para interpretar sentenças na linguagem.
Motivação
Quando uma estrutura de problema particular ocorre várias vezes,
pode ser interessante representá-la através de uma sentença em uma
linguagem simples, de modo a solucionar o problema através da
construção de um interpretador para esta sentença.
Em várias destas situações, em vez de construir algoritmos de
interpretação manualmente, um interpretador genérico de expressões
regulares pode solucionar o problema rapidamente.
O padrão Interpreter usa classes para representar cada regra de uma
gramática (expressão regular).
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Interpreter
Aplicabilidade
Use o Padrão quando:
A gramática é simples
⌧
Para gramáticas complexas a hierarquia de classes se torna difícil
de gerenciar. Neste caso, geradores de parsers são uma alternativa
melhor.
Eficiência não é uma questão crítica
⌧
Código intermediário permite maior eficiência
⌧
Expressões podem ser traduzidas para máquinas de estado finito
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Interpreter
Conseqüências
É fácil modificar e estender a gramática
Implementar a gramática também é fácil
Gramáticas complexas são difíceis de manter
Adicionar novas formas de interpretar expressões é
simples
Iterator
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Iterator (Cursor)
Intenção
Provê uma forma de acessar seqüencialmente os elementos de um
agregado de objetos, sem expor a representação interna deste
agregado.
Motivação
Objetos agregados como listas, tabelas hash, dicionários, etc,
devem permitir que se acessem seus elementos de modo
abstrato, sem que a representação interna de sua estrutura seja
exposta
Eventualmente também pode se desejar fazer duas travessias
concorrentes sobre um mesmo objeto agregado.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Return new ConcreteIterator(this);
Client
Aggregate
createIterator()
ConcreteAggregate
createIterator()
Padrão
Iterator
Estrutura e Participantes
Iterator
first()
next()
isDone()
currentItem()
ConcreteIterator
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Iterator
Aplicabilidade
Use o Padrão Iterator quando:
Se deseja acessar o conteúdo de um objeto agregado sem
expor sua representação interna
Se deseja suportar múltiplas travessias de um objeto agregado
Se quer prover uma interface uniforme para atravessar
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Iterator
Conseqüências
Suporte a variações na maneira de se atravessar um
objeto agregado (pre-order, pós-ordem, em-ordem)
Simplificação da interface do agregado
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Iterator
Exercícios
Observar o uso de agregados no pacote java.util.
JDK 1.1 - Hashtable, Vector, Enumeration
JDK 1.2 - Collection, Iterator
Hash Table Resizable Array Balanced Tree Linked List
HashSet TreeSet
ArrayList
LinkedList
HashMap TreeMap
Set
List
Map
IMPLEMENTAÇÕES - JDK 1.2
INTERF
A
C
ES
Mediator
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Mediator
Intenção
Define um objeto que encapsula o modo como um conjunto de objetos
interage. Promove um acoplamento fraco entre objetos, evitando que
referenciem diretamente um ao outro e permitindo que se possa variar
a interação entre eles de modo independente.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Mediator
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Mediator
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Mediator
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Mediator
Memento
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Memento
Intenção
Sem violar encapsulamento, captura e armazena externamente o
estado de um objeto, de modo que o estado anterior de um objeto
possa ser posteriormente restaurado.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Memento
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Memento
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Memento
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Memento
Observer
Observer(s)
30%, 20%, 50%
30%, 10%, 60%
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão Observer
Intenção
Define uma dependência 1-para-n entres
objetos, de modo que quando o estado de
um objeto é alterado todos seus dependentes
são notificados e atualizados
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Observer
Motivação
Suponha que você deseja fornecer várias visões
distintas de um mesmo objeto que funciona como um
repositório de dados
Cada visão é criada por um objeto observador
independente
Caso cada observador seja diretamente conectado ao
repositório, isto criará uma dependência do repositório
com relação aos diferentes observadores, o que lhe
reduzirá a reusabilidade e flexibilidade
O padrão Observer descreve uma forma de manutenção
destes relacionamentos de modo que observadores e
repositórios sejam facilmente substituídos
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Observer
Estrutura e Participantes
return subjectState
Subject
attach(Observer)
Observer
update()
detach(Observer)
notify()
For all o in observers {
o.update();
}
observerState =
subject.getState();
ConcreteSubject
getState()
subjectState
ConcreteObserver
update()
observerState
subject
observers
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Observer
Aplicabilidade
Use o Padrão Observer em Algumas das Situações:
Quando uma abstração apresenta dois aspectos, um
dependente do outro. Encapsulando estes aspectos em objetos
separados permite que você os varie e reutilize de forma
independente
Quando uma modificação em um objeto requer modificação em
outros, e você não sabe (em tempo de programação) quantos
objetos precisam ser modificados
Quando um objeto deve ser apto a notificar outros objetos sem
saber quem são estes objetos. Em outras palavras, quando você
os quer fracamente acoplados
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Observer
Conseqüências
Variação independente de observáveis e
observadores
É fácil adicionar observadores sem
modificar o observável ou os outros
observadores
Suporte a comunicação broadcast
Atualizações inesperadas (caso o processo
de notificação seja simplificado)
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Observer
Exercícios
Veja a implementação do padrão observer nos
componentes do pacote AWT
Destaque as diferenças entre o padrão original e a
implementação do AWT
State
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
State
Intenção
Permite que um objeto altere seu comportamento quando seu estado
interno se modifica. O objeto parecerá ter mudado de classe.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
State
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
State
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
State
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
State
Strategy
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Strategy
Intenção
Define uma família de algoritmos, encapsula cada um, e os faz
inter-cambiáveis. Permite que o algoritmo varie independentemente dos
clientes que o utilizam.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Strategy
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Strategy
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Strategy
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Strategy
Template Method
a() b()
a()
b()
TemplateMethod()
a(..);
...
b(..);
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Template Method
Intenção
Define o esqueleto de um algoritmo através de uma operação,
deixando que subclasses refinem o restante do algoritmo. Permitem
que subclasses redefinam certos aspectos de um algoritmo sem
modificar a estrutura do algoritmo.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Template Method
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Template Method
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Template Method
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Template Method
Visitor
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Visitor
Intenção
Representa uma operação a ser executada sobre os elementos da
estrutura de um objeto. Visitantes possibilitam a definição de novas
operações sem modificar as classes dos elementos sobre as quais ele
atua.
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Visitor
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Visitor
Aplicabilidade
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])
Padrão
Visitor
Padrões de Design Orientados a Objetos. Copyright © 1999, 2003. Jorge H. C. Fernandes. ([email protected])