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 especiaisO 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