Disparando eventos com Observer, Proxy e Generics
Proposta
Neste workshop veremos como utilizar o padrão Proxy e o seu suporte na JSE para criar um componente que facilita a implementação do padrão Observer muito utilizado em Java para implementar mecanismos orientados a eventos. Veremos também como fazer a manipulação de exceções neste caso.
O padrão Observer
Em traços largos o padrão Observer em Java é utilizado para prover funcionalidades de eventos e é composto de três peças. A primeira é o objeto que gera o evento de interesse - o observado. A segunda é o contrato que os interessados no evento - os observadores - tem que implementar. Finalmente, a terceira peça é o evento em si que é criado pelo observado e enviado aos observadores.
Na prática é criada uma interface que tem um método por cada tipo de evento que o observado pode enviar. Vamos criar um exemplo simples de um observado que envia eventos. A nossa classe simula uma lista que avisa quando objectos são adicionados e removidos. Vamos começar com a implementação sem os mecanismos do padrão Observer.
O tipo genérico T representa o tipo de objectos que serão adicionados/removidos, que podem ser quaisquer.
public class Bag<T> {
private List<T> list = new LinkedList<T>();
public Bag(){}
public void add(T element){
list.add(element);
}
public void remove(T element){
list.remove(element);
}
}
Este nosso objeto Bag já funciona, mas queremos que ele tenha dois eventos, adicionar e remover,
que serão disparados quando um elemento for adicionado ou removido, respetivamente.
A nossa interface para os observadores precisa, então, de dois métodos que chamaremos onAdd e
onRemove e ambos terão como argumento um objeto de evento. O prefixo "on" é utilizado
para designar chamadas que representam eventos, mas não é obrigatório.