Submarino.com.br




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);
	}

}			
			
Código 1: Codigo simples da classe Bag

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.