Action X Observer

4 respostas
E

Bom, é o seguinte, estou tendo dificuldades para fazer com que uma classe dispare um evento, pesquisei e encontrei materiais sobre Actions e Observers, e nao nao entendi muita coisa. A minha situacao, eh a seguinte:
Tenho uma classe que controla conexoes atravez de um socket, eu gostaria q esta classe dispara-se um evento toda vez que recebe-se uma nova conexao ou que uma conexao fosse terminada, para que posteriormente na parte grafica da aplicacao eu pude-se intercepta-lo e fazer o tratamento adequado.
Desde jah agradeço. valeu

4 Respostas

ViniGodoy

1. Crie uma interface para os listeners desse evento, por exemplo:

/**
 * Define an interface for Connection listeners
 */
public interface ConnectionListener extends EventListener
{
   /**
    * Informs the stopping of the connection.
    * @param evt The ConnectionEvent that describes the problem.
    */
   void connectionStopped(ConnectionEvent evt);
   
   /**
    * Informs that the connection was opened.
    * @param evt The ConnectionEvent describing the opening. 
    */   
   void connectionOpened(ConnectionEvent evt);
}

2. Crie o seu evento. Aqui não coloquei propriedade nenhuma, mas você pode colocar as propriedades que quiser.
Eventos diferentes devem ter classes diferentes, preferencialmente baseados numa superclasse.

/**
 * Represent any events generated by the <tt>Connection</tt> object.
 * @author Vendramin, Márcio
 * @author Mendonça, Vinícius Godoy de
 */
public class ConnectionEvent extends EventObject
{   
   /**Create a new connection event
    * @param source The connection that generated the event.
    */
   public ConnectionEvent(Object source)
   {      
      super(source);
   }
}
3. Na sua classe que controla conexões, crie um List para manter uma lista de listeners, e crie métodos em sua classe para adicionar e remover listeners. Geralmente é uma boa idéia criar uma superclasse da sua classe só para gerenciar esse tipo de coisa. Uma espécide de AbstractConnectionManager, por exemplo:
List<ConnectionListener> listeners = new ArrayList<ConnectionListener();

public void add(ConnectionListener listener) {
   if (listener == null) 
     throw new NullPointerException("Listener cannot be null!");
   listeners.add(listener);
}

public void remove(ConnectionListener listener) {
   listeners.remove(listener);
}
4. Crie métodos para disparar o evento. Passe como parâmetro as propriedades que irão dentro do evento, mas não o evento em si.
public void fireConnectionOppened() {
     ConnectionEvent evt = new ConnectionEvent(this);
     for (Listener l : listeners) {
          l.connectionOpened(evt);
     }
}

public void fireConnectionStopped() {
     ConnectionEvent evt = new ConnectionEvent(this);
     for (Listener l : listeners) {
          l.connectionStopped(evt);
     }
}

5. Chame esses métodos nos locais apropriados (após abrir uma conexão ou fecha-la).>

E

Valeu cara. muito obrigado, axo q agora consigo. valeu mesmo

R

E ae kras, apenar de ser um tópico antigo, me ajudou mto hje…

Eu estava usando, na minha classe de SOCKET, uma variável STATE. Ae o usuario da minha API teria q ficar num WHILE TRUE pra qnd a variável de status mudasse, ele faria o q tinha q fazer… A minha unica maneira de trocar informações com o usuario era essa variável. Mas fui procurar sobre fazer o Listener, para o usuario simplesmente dar implementação na minha interface, e graças a seu exemplo, ajudou bastante…

Valeu… Flw

ViniGodoy

Eu também uso esse pattern com Sockets e Channels. :slight_smile:

Criado 12 de novembro de 2007
Ultima resposta 12 de mar. de 2008
Respostas 4
Participantes 3