A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Padrão de Projeto Visitor

Apresentações semelhantes


Apresentação em tema: "Padrão de Projeto Visitor"— Transcrição da apresentação:

1 Padrão de Projeto Visitor
Daniel Chevitarese Leandro Alvim

2 Introdução Propósito do Padrão Motivação Aplicação Estrutura
Participantes Colaborações Conseqüências Exemplo de Código

3 Propósito do Padrão Representação de operações;
Possibilitar a adição de operações especializadas de forma que não haja a necessidade da modificação de diversos elementos da estrutura

4 Motivação Problema Solução usual Solução por padrão (Visitor)
Representar operações especializadas que devem ser executadas sobre os elementos de uma estrutura Solução usual Implementar operação especializada em cada elemento da estrutura Solução por padrão (Visitor) Elaboração de um padrão que possibilite a adição de novas operações especializadas de forma que não haja a necessidade da modificação de diversos elementos da estrutura Como ? Separação do comportamento da estrutura

5 Motivação Exemplo de um Compilador Representação de um programa
Árvore sintática abstrata A árvore possui diferentes tipos de nós Operadores; Variáveis; Expressões matemáticas; Exemplo de operações de um compilador na árvore sintática abstrata Formatação; Verificação de tipos; Verificar se todas as variáveis estão definidas; Geração de código

6 Motivação Problema Solução usual
As operações podem necessitar tratar cada tipo de nó de maneira diferente Solução usual Definição da operação na classe que a utiliza; Desvantagens Inclusão de novas operações requer a mudança de todas as classes de nós; Poluição das classes com muitas operações Mistura de verificação de tipos com formatação

7 Motivação Solução por padrão
Encapsular a operação em um objeto em separado (Visitor) Algoritmo do Visitor O objeto Visitor percorre os elementos da árvore; Se um nó da árvore “aceita” um visitor então chama um método seu que inclui o tipo do nó como argumento; Executa a operação para aquele nó (a operação que costumava estar na classe nó)

8 Motivação

9 Aplicação Quando se têm muitas classes de objetos com interfaces distintas e quer-se realizar operações nesses objetos que dependam das suas classes concretas; Quando a estrutura de objetos é utilizada por diversas aplicações Cada aplicação com seu Visitor apropriado; Possibilidade de reuso de Visitors comuns; Quando se quer evitar a poluição da classe com operações não-relacionadas e que são utilizadas em vários objetos; Quando a estrutura que define os objetos é praticamente estática e as operações realizadas neles estão em constante mudança A situação inversa não se aplica

10 Estrutura

11 Participantes Visitor ConcreteVisitor Element
Declara uma operação de visita (Visit) para cada classe a ser visitada (ConcreteElement); Identifica a classe ConcreteElement através do nome e assinatura da operação Visit ConcreteVisitor Implementa cada operação de visita declarada pelo Visitor; Cada operação implementará um algoritmo que receberá o seu contexto e estado de atuação Element Define a operação Accept que recebe um Visitor como argumento

12 Participantes ConcreteElement ObjectStructure
Implementa a operação Accept que recebe um Visitor como argumento ObjectStructure Pode enumerar diversos Elements; Pode prover uma interface que permita o Visitor visitar os seus Elements associados; Pode ser um composite ou uma coleção (lista ou conjunto)

13 Colaborações

14 Conseqüências – Vantagens
Facilidade na adição de operações Com as operações concentradas no Visitor, não há necessidade de implementação da operação em diversas classes; Para uma nova funcionalidade, simplesmente adicione um novo Visitor Agrupamento lógico-comportamental de operações Comportamentos não ficam espalhados e sim agrupados por Visitor; Comportamentos não relacionados ficam em Visitors distintos Visitação de objetos pertencentes a hierarquias distintas Note que um Iterador não conseguiria esta façanha Acúmulo de estados A não-utilização do Visitor, força o desenvolvedor a guardar o estado em um objeto e passando por parâmetro (padrão Collecting Parameter)

15 Conseqüências – Desvantagens
A adição de classes ConcreteElement pode ser trabalhosa Cada ConcreteVisitor tem que ser mudado para adicionar a nova operação Dependência entre Visitante e Visitado Quebra do encapsulamento Como a operação encontra-se dentro de um Visitor e não em um ConcreteElement, este pode necessitar expor uma maior quantidade de interfaces para que o Visitor o acesse

16 Exemplo de Código interface Visitor { void visit(Wheel wheel);
void visit(Engine engine); void visit(Body body); void visitCar(Car car); void visitVehicle(Vehicle vehicle); } class Wheel { private String name; Wheel(String name) { this.name = name; String getName() { return this.name; public void accept(Visitor visitor) { visitor.visit(this); class Engine { class Body { abstract class Vehicle { protected Engine engine = new Engine(); protected Body body = new Body(); protected Wheel[] wheels; public Engine getEngine() { return this.engine; } public Body getBody() { return this.body; public Wheel[] getWheels() { return this.wheels; public void accept(Visitor visitor) { visitor.visitVehicle(this); class Car extends Vehicle { public Car() { super(); this.wheels = new Wheel[]{ new Wheel("front left"), new Wheel("front right"), new Wheel("back left"), new Wheel("back right") }; visitor.visitCar(this);

17 Exemplo de Código class PrintVisitor implements Visitor {
public void visit(Wheel wheel) { System.out.println("Visiting “ + wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); public void visit(Body body) { System.out.println("Visiting body"); public void visitVehicle(Vehicle vehicle) { System.out.println("Visiting vehicle"); public void visitCar(Car car) { System.out.println("Visiting car"); car.getEngine().accept(this); car.getBody().accept(this); for(Wheel wheel : car.getWheels()) { wheel.accept(this); class DoVisitor implements Visitor { public void visit(Wheel wheel) { System.out.println("Steering my wheel"); } public void visit(Engine engine) { System.out.println("Starting my engine"); public void visit(Body body) { System.out.println("Moving my body"); public void visitCar(Car car) { System.out.println("Starting my car"); car.getEngine().accept(this); car.getBody().accept(this); for(Wheel wheel : car.getWheels()) { wheel.accept(this); public void visitVehicle(Vehicle vehicle) { System.out.println("Starting my vehicle");

18 Exemplo de Código public class VisitorDemo{
static public void main(String[] args){ Car car = new Car(); Visitor printVisitor = new PrintVisitor(); Visitor doVisitor = new DoVisitor(); car.accept(printVisitor); car.accept(doVisitor); }

19 Fim Daniel Chevitarese Leandro Alvim daniel@chevitarese.com.br


Carregar ppt "Padrão de Projeto Visitor"

Apresentações semelhantes


Anúncios Google