Você está na página 1de 40

Design Pattern

Chain of Responsibility Observer - Visitor

Eder Petrica, Eliton L. S. Perin, Yuri K. B. Tomas

Chain of
Responsibility

Objetivo

Evitar o acoplamento do remetente de um pedido para o seu receptor

da a mais de um objeto a chance de lidar com o pedido

Acorrentar os objetos que recebe e passar a solicitao ao longo da


cadeia at que um objeto lide com ele

Motivao

A idia deste modelo de dissociar emissores e receptores


O primeiro objeto na cadeia recebe o pedido, e manipula ou encaminha
para o prximo candidato na cadeia

Motivao

Aplicabilidade - Situaes

Quando mais de um objeto pode lidar com uma solicitao


Quando deseja-se emitir um pedido a um dos vrios objetos sem
especificar o receptor de forma explcita
Quando o conjunto de objetos que podem lidar com um pedido deve ser
especificado dinamicamente

Estrutura

Participantes

Handler (HelpHandler)

ConcreteHandler (PrintButton, PrintDialog)

define uma interface para o tratamento dos pedidos.


implementa o link sucessor (opcional)
lida com solicitaes que responsvel
pode acessar o seu sucessor
manipular a solicitao

Cliente

inicia o pedido para um objeto ConcreteHandler na cadeia.

Colaboraes

Quando um cliente emite uma solicitao, a solicitao se propaga ao


longo da cadeia at que um objeto ConcreteHandler assuma a
responsabilidade de lidar com ele

Consequncias

Acoplamento reduzido
Adio flexibilidade na atribuio de responsabilidades a objetos
Recebimento no garantido

Padres relacionados

Composite

Observer

Dependents
Publish-subscribe

Objetivo

Definir dependncia um para muitos


Um objeto muda de estado

Suas dependncias so notificadas e atualizadas automaticamente.

Motivao

Quebrar um sistema em diversas classes

No desejamos consistncia atravs de classes fortemente acopladas

Manter consistncia entre objetos relacionados


Isto reduz usabilidade

Exemplo
UI + Data
Database triggers
RSS
Mailing list

Motivao

Estabelecer relao entre subject/publisher e observers/subscribers


Subject ter qualquer quantidade de observers

Todos os observers so notificados quando h uma mudana de estado no subject

Participantes

Subject | Publisher

Conhece seus observers


Pode ter vrios observers
Prov interface para sua conexo com os observers

Observer | Subscriber

Define uma interface de atualizao que seria notificada quando houver mudana em
um Subject

Participantes

ConcreteSubject

Guarda o estado de interesse para os objetos do ConcreteObserver


Manda notificaes para seus observers quando houver mudana de estado

ConcreteObserver

Mantem referncia para um ConcreteSubject


Guarda o estado que dever ficar consistente com o subject

Implementa a interface de atualizao do observer mantendo o estado consistente com o


subject.

Aplicabilidade - Situao I

Uma abstrao possui dois aspectos

Um dependente do outro
Encapsul-los em dois objetos distintos
Usabilidade
Reuso

Aplicabilidade - Situao II

Mudana em um objeto requer alterao em outras

Voc no sabe quais objetos necessitam ser alterados

Aplicabilidade - Situao III

Um objeto precisa notificar outros sem saber quem eles so

Voc no quer estes objetos fortemente acoplados

Comunicao

ConcreteSubject

Notifica seus observers quanto a ocorrncia de uma mudana que poderia deix-los
inconsistentes.

Concrete observer

Aps ser informado da mudana citada acima, pode consultar o subject sobre a
informao.
A informao usada para deix-lo consistente novamente.

Comunicao

Estrutura

Consequncias

Acoplamento abstrato entre subject e observers

O subject no conhece as classes concretas de seus observers

O padro permite variar subjects e observers de forma independente.

Reuso de subjects sem reusar seus observers e vice-versa


Adicionar observers sem modificar subjects e outros observers

Consequncias / vantagens
1.
2.
3.

Abstrair acoplamento entre observer e subject


Apoio a broadcast
Updates inesperados

Usos conhecidos

Small talk model / view controller


InterViews

Padres relacionados

Mediator
Singleton

Visitor

ProgramNodeEnumerator

Objetivo
Representar uma operao para ser transformada nos elementos de uma
estrutura de objeto. Visitor permite que voc defina uma nova operao sem
mudar as classes dos elementos em que ele opera.

Motivao

O problema est na distribuio de todas as operaes atravs de vrias


classes que nos leva a um sistema difcil de entender, manter e mudar.
A adio de uma nova operao normalmente requer recompilhar todas
as classes.

Aplicabilidade

Realizar operaes em objetos que dependem de suas classes concretas.


Quando existem muitas operaes distintas e independentes precisam
ser executados com os objetos em uma estrutura de objetos, e voc
deseja limpar, deixando mais clara sua classe com essas operaes. O
Visitor permite manter essas operaes relacionadas em uma classe.
Quando a estrutura do objeto compartilhado para muitos, use o Visitor
para colocar as operaes somente em quem precisa.
Se as estruturas do objeto mudam muito, ento provavelmente melhor
para definir as operaes nessas classes. melhor no usar.

Estrutura

Participantes

Visitor (Visitante)

ConcreteVisitor (Visitante de Verdade)

define uma operao de Aceito que tem um Visitante como argumento.

ConcreteElement

implementa cada operao deplarada pelo Visitor.

Element

declara uma operao para cada classe de ConcreteElement.

implementa uma operao de Aceito que tem um Visitante como argumento.

ObjectStructure

enumera seus elementos


pode providenciar uma estrutura que permite o visitante visitar seus elementos
pode ser um composite ou uma collection tal como uma lista ou conjunto.

Colaboraes

O cliente que usa o Visitor deve criar um objeto ConcreteVisitor e ento


atravessar a estrutura do objeto, visitando cada elemento com o Visitor.

Consequncias

Torna fcil a adio de novas operaes.


Reunir operaes relacionadas ou separar operaes no relacionadas.
Adio de novas classes ConcreteElement difcil.
Visitao atravs das hierarquias de classes.
Acumulao de estados.
Quebra de encapsulao.

Implementao

Cada objeto estruturado ter uma classe Visitor associado.


A classe abstrata Visitor declara uma operao para cada classe de
ConcreteElement.
Cada operao de visita no Visitor declara para ser um nico
ConcreteElement permitindo a visita.
Cada classe ConcreteElement implementa uma operao Aceitar que liga
o Visitor ao ConcreteElement.
Expedio dupla.
De quem a reponsabilidade?

Pode esar na estrutura do objeto, no Visitor ou em um objeto iterador separado.

Estrutura

Exemplo

Padres relacionados

Composite
Interpreter

Você também pode gostar