terça-feira, 9 de novembro de 2010

Visitor Pattern

Definição
O visitor pattern representa uma operação a ser realizada sobre elementos da estrutura de um objeto. O Visitor permite que se crie um nova operação sem que se mude a classe dos elementos sobre as quais ela opera. É uma maneira de separar um algoritmo da estrutura de um objeto.
Quando usar
·        Quando uma estrutura de objetos contém muitas classes de objetos com interfaces que diferem e você deseja executar operações sobre estes objetos que dependem das suas classes concretas;
·        Quando muitas operações distintas e não-relacionadas necessitam ser executadas sobre objetos de uma estrutura de objetos, e você deseja evitar “a poluição” das suas classes com estas operações.
Benefícios
·        Visitor torna fácil a adição de novas operações.
·        Um visitante reúne operações relacionadas e separa as operações não-relacionadas.
·        Visitor pode visitar objetos que não compartilham uma classe mãe. Você pode acrescentar qualquer tipo de objeto á interface de um Visitor.
Desvantagens/Consequencias
·        Rompe o encapsulamento: A abordagem do padrão Visitor assume que a interface é poderosa o suficiente para permitir aos visitantes executarem o seu trabalho. Como resultado, o padrão frequentemente força fornecer operações publicas que acessam o estado interno de um elemento, o que pode comprometer seu encapsulamento.
Exemplo
A idéia é usar uma classe de elementos como uma estrutura, sendo que cada uma delas possui um método cujo um dos argumentos é um objeto do tipo visitor. Visitor é uma interface que possui um método visit() para cada classe de elementos. O método accept() de uma classe de elementos invoca o método visit() de sua respectiva classe. Classes visitor concretas distintas podem então ser escritas para implementar operações especiais
O padrão Visitor é uma solução para separar o algoritmo da estrutura. Uma das vantagens desse padrão é a habilidade de adicionar novas operações a uma estrutura já existente. Com ele, podemos ter a classe ObjetoSolido e o comportamento de queda em uma classe Gravidade, separada da estrutura do ObjetoSolido. Isso é feito através de uma interface, onde o objeto que vai executar esse método da classe do comportamento, passa uma referencia dela mesmo junto dos parâmetros normais da classe. No caso desse exemplo, teríamos:


Visitor gravidade = new Gravidade();
    //esse é o nosso visitor, responsável pelo comportamento de queda.

    Solido solido = new Solido("caixa");
     //solido que recebera o comportamento

    solido.accept(gravidade); //recebe o comportamento Gravidade
Internamente, o método accept(Visitor visitor) de Solido faz o seguinte:

public void accept(Visitor visitor) {
    visitor.visitSolido(this);
}



Ao passar para o Visitor uma referencia de si mesmo, o visitor pode acessar os métodos e atributos públicos dessa classe, que no nosso caso, vai adicionar a aceleração da gravidade ao Solido. Assim como o comportamento de queda foi adicionado, outros também poderiam ser feitos da mesma maneira, como movimentação através do teclado, sons... as possibilidades são infinitas.

Exemplo de Uso

O compilador Smalltalk-80 tem uma classe Visitor chamada ProgramNodeEnumerator.
IRIS Inventor é um toolkit para o desenvolvimento de aplicações gráficas 3D.

Nenhum comentário:

Postar um comentário