MAC 441/5714 - Programação Orientada a Objetos
Aula 20 - 29/5/05
Quase terminando com os Padrões de Projeto de Software
"Os
últimos serão os primeiros".
alguém que estava em último
Last but not least - vamos
terminar de ver (quase) todos os
padrões do GoF hoje.
Adapter (139) - Estrutural
- objetivo: converter a interface de uma classe em uma outra
interface que é esperada por um cliente.
- também conhecido como: Wrapper
- permite que classes incompatíveis sejam colocadas para
trabalhar em conjunto
- exemplo simplezinho: adaptar a interface de um vetor para prover
uma interface tipo pilha (push/pop)
Bridge (151) - Estrutural
- objetivo: desacoplar uma abstração de sua
implementação de forma que as duas coisas possam variar
independentemente.
- leva a duas hierarquias de classes gêmeas: a da
abstração e a da implementação.
- Segundo o Joe Yoder, é um dos padrões de projeto
menos usados.
- Se você conhecer um exemplo interessante onde este
padrão é útil, mande para mim.
Decorator (175) - Estrutural
- Objetivo: adicionar novas responsabilidades a um objeto
dinamicamente.
- Decoradores oferecem uma alternativa mais flexível para
herança. Pode ser usado para adicionar funcionalidades a objetos
individuais ao invés da classe inteira.
- também conhecido como: Wrapper
- exemplo do GoF: em um editor de textos onde o texto é
mostrado por aTextView
que é decorado por um aScrollDecorator
que é decorado por um aBorderDecorator
- outro exemplo bem interessante do GoF: Stream do ET++ nas
páginas 183 e 184.
Proxy (207) - Estrutural
- Objetivo: provê um objeto intermediário que permite
controlar o acesso ao objeto original.
- exemplo do GoF: na pág. 208, um ImageProxy controla o
acesso a uma imagem
- usos: remote proxy (para objetos em outro espaço de
endereçamento), virtual proxy (para objetos pesados que
não são carregados na memória quando não
são necessários), protection proxy (para controlar quem
pode e quem não pode acessar o objeto original, e.g.:
KernelProxy no Choices controla as chamadas ao sistema operacional) e
smart references (podem ser usadas para contagem de referências,
carga em memória sob demanda ou controle de concorrência (locks)).
Chain of Responsibility (223) - Comportamental
- Objetivo: desacoplar o emissor de uma requisição de
seu receptor dando a mais de um objeto a oportunidade para
processá-la.
- Cria-se uma cadeia de objetos receptores e a
requisição vai sendo passada de um a outro até que
alguém a processe.
- Exemplo do GoF na página 223: tratamento do evento Help
numa aplicação de janelas.
- dizemos que a requisição (ou mensagem) tem um
destinatário implícito.
- Padrão relacionado: é implementado
freqüentemente junto com o Composite.
Interpreter (243) - Comportamental
- Objetivo: dada uma linguagem, define uma
representação para sua gramática juntamente com um
interpretador que usa esta representação para interpretar
sentenças na linguagem.
- Usos: implementação de compiladores,
implementação de processadores de XML, interpretadores de
comandos (shell), etc.
- Maiores detalhes: na disciplina de Compilação.
Visitor (331) - Comportamental
- Objetivo: Representar uma operação a ser realizada
nos elementos de uma estrutura de objetos.
- Permite definir uma nova operação sem mudar as
classes dos elementos nos quais ele opera.
- Exemplo do Gof: página 332: NodeVisitor e subclasses TypeCheckingVisitor e CodeGenerationVisitor. Em Java,
poderíamos falar ainda de um nível a mais na hierarquia: BytecodeGenerationVisitor e NativeCodeGenerationVisitor.
- Padrões relacionados: muitas vezes o visitante é
usado para percorrer os elementos de um Composite; o visitante pode
realizar a interpretação no padrão Interpreter.
- Também conhecido como: Action, Transaction.
- Usos: undo, logs, distribuição de tarefas, etc.
Moral da História:
- use e abuse dos padrões
- mas com moderação e criteriosamente
Referência básica
Referências online
- Slides
do curso de padrões dado pelo Joe Yoder no IME em 2003
- Página
dos cursos dados pelo Joe Yoder incluindo
o vídeo das palestras!
Vários lugares da Web contém uma
documentação muito boa sobre os padrões GoF.
Página de MAC 441/5714
Página do Fabio
Página do DCC