Pattern Listener. Como?

8 respostas
Fox_McCloud

Eu estava contando a um amigo meu do meu estudo no desenvolvimento de jogos, dizendo da propagação do método update() a cada Sprite nas iterações. Ele me deu uma idéia, de usar o Pattern Listener ao invés de propagar o método. Então aqui estão as minhas perguntas:

Como eu faço para tornar um objeto “listeneable”, ou seja, como eu crio um método addListener no meu objeto que me permita adicionar um listener a ele como eu faria com um componente Swing, por exemplo?

Outra coisa: como eu disparo um evento de outro método que atinja a todos os objetos “listeneable” aos quais eu adicionei um listener?

8 Respostas

Rafael_Nunes

Pelo que sei Listener é um pattern JEE, para ouvir eventos dá uma olhada no pattern ‘Observer’, e neste Pattern você não define um objeto como ‘observeable’, e sim nos métodos que serão assistidos você adiciona as notificações.

Fox_McCloud

É exatamente isso. Eu não havia lembrado desse nome “observer”.
Mas onde eu leio sobre ele?

G

http://java.sun.com/j2se/1.5.0/docs/api/java/util/Observable.html

Fox_McCloud

Obrigado

_fs

Exemplo bobo:

interface FormObserver {
    public void notifyLoad();
    public void notifyUpdate();
    public void notifyDelete( Object deleted );
}

class Form {
    private List< FormObserver > observers = new ArrayList< FormObserver >();
    public void load() {
        for( FormObserver obs : observers ) {
            obs.notifyLoad();
        }
    }
    // mesmo para os outros métodos

    public void addObserver( FormObserver observer ) {
        observers.add( observer );
    }
}

class Table extends JTable implements FormObserver {
    public void notifyDelete( Object deleted ) {
        getModel().remove( deleted );
    }
}
E

Olá,

No pacote java.util existem classes e interfaces para implementação do padrão observer-observable. Esse é um padrão comportamental de projeto orientado a objetos. Foi catalogado pelo Erich gamma. et. al, Design Patterns. Esta é, sem dúvida, a melhor referência sobre o assunto.

Att,
Emerson Aguiar Noronha

Fox_McCloud
Tá aí... gostei! Muito interessante!
import java.util.Observable;

public class ValorNumerico extends Observable{

	private int numero;
	
	public void startChanging(){
		new Thread(){
			public void run(){
				while(true){
					setNumero((int)((Math.random()*10)+1));
					try {
						sleep(500);
					} catch (InterruptedException e) {}
				}
			}
		}.start();
	}

	public int getNumero() {
		return numero;
	}

	public void setNumero(int numero) {
		this.numero = numero;
		setChanged();
		notifyObservers();
	}
	
}
import java.util.Observable;
import java.util.Observer;

public class Main{

	private ValorNumerico valor;
	
	public Main(){
		valor = new ValorNumerico();
		valor.addObserver(new Observer(){
			public void update(Observable obs, Object obj) {
				if(obs.equals(valor)){
					System.out.println(((ValorNumerico)obs).getNumero());
				}
			}
		});
		valor.startChanging();
	}
	
	public static void main(String args[]){
		new Main();
	}

}
E

Outro conjunto de classes interessantes, utilizado pelos componenetes do swing - o swing é uma verdadeira referencia para projeto OO - é:

java.beans.PropertyChangeSupport
java.beans.PropertyChangeEvent
java.beans.PropertyChangeListener

Att,
Emerson Aguiar Noronha

Criado 28 de abril de 2006
Ultima resposta 28 de abr. de 2006
Respostas 8
Participantes 5