Action X Observer

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

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

[code]/**

  • 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);
      }[/code]
  1. 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.

[code]
/**

  • Represent any events generated by the Connection 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);
      }
      }[/code]
  1. 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:

[code]List 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);
}[/code]

  1. 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.

[code]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);
}
}[/code]

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

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

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

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