2009-09-25 9 views
10

J'ai une classe appelée CommunicationManager qui est responsable de la communication avec le serveur. Il comprend les méthodes login() et onLoginResponse(). En cas de connexion de l'utilisateur, la méthode login() doit être appelée et lorsque le serveur répond, la méthode onLoginResponse() est exécutée.Comment implémenter des rappels en Java

Ce que je veux faire est de lier des actions avec l'interface utilisateur. Dans la classe GUI, j'ai créé une instance de CommunicationManager appelée mCommunicationManager. A partir de la classe GUI la méthode login() est simplement appelé par la ligne

mCommunicationManager.login(); 

Ce que je ne sais pas comment faire lie la méthode de la classe GUI à onLoginResponse(). Par exemple si la classe GUI inclut la méthode notifyUser() qui affiche le message reçu du serveur.

Je voudrais vraiment apprécier si quelqu'un pouvait montrer comment lier des méthodes afin d'exécuter la méthode de la classe GUI (ex. GUI.notifyUser()) lorsque l'instance de la classe mCommunicationManager reçoit le message du serveur et la méthode CommunicationManager.onLoginResponse() est exécutée.

Merci!

+0

pourquoi personne n'a dit à propos de l'appel http pour cette fonction de rappel qui implique swing? – gumuruh

+0

Question d'un débutant. Pourquoi pouvez-vous faire System.out.print (mCommunicationManager.login()); (Supposons que l'impression du message à partir du serveur est la tâche)? Je comprends le cas d'utilisation dans un modèle multi-thread mais ne peux pas visualiser le scénario de connexion dans un modèle multi-thread. – user3388324

Répondre

25

Il y a deux modèles que je peux vous voir utiliser. L'un est le publish/subscribe or observer pattern mentionné par Pete. Je pense que c'est probablement ce que vous voulez, mais vu que la question mentionne la liaison d'une méthode pour une exécution ultérieure, j'ai pensé que je devrais mentionner le Command pattern. Le motif de commande est essentiellement une solution de rechange au fait que Java ne traite pas les méthodes (fonctions) comme des objets de première classe et qu'il est donc impossible de les contourner.Au lieu de cela, vous créez une interface qui peut être transmise et qui encapsule les informations nécessaires sur la façon d'appeler la méthode d'origine.

Donc, pour votre exemple:

interface Command { 
    public void execute(); 
} 

et vous puis passez dans une instance de cette commande lorsque vous exécutez la fonction login() (non testé, j'oublie toujours comment obtenir des classes anonymes à droite):

final GUI target = this; 
command = new Command() { 
    @Override 
    public void execute() { 
     target.notifyUser(); 
    } 
}; 
mCommunicationManager.login(command); 

Et dans la fonction login() (gestionnaire enregistre référence à la commande):

public void login() { 
    command.execute(); 
} 

edit: je devrais probablement mentionner que, bien que ce soit l'explication générale de la façon dont cela fonctionne, en Java il y a déjà une plomberie à cet effet, à savoir les ActionListener et les classes connexes (actionPerformed() est essentiellement le execute() dans Command). Ceux-ci sont principalement destinés à être utilisés avec les classes AWT et/ou Swing, et ont donc des caractéristiques spécifiques à ce cas d'utilisation.

1

Vous pouvez regarder les SWT-extraits (voir les auditeurs)

http://www.eclipse.org/swt/snippets/

ou vous utilisez la classe runnable, par écrasant la méthode d'exécution avec votre « callback' code lorsque vous créez un instance

3

L'idiome utilisé en Java pour obtenir un comportement de rappel est Listeners. Construire une interface avec des méthodes pour les événements que vous voulez, avoir un mécanisme pour enregistrer l'objet écouteur avec la source des événements. Lorsqu'un événement se produit, appelez la méthode correspondante sur chaque écouteur enregistré. C'est un modèle commun pour les événements AWT et Swing; pour un exemple choisi au hasard, voir FocusListener et l'objet FocusEvent correspondant.

Notez que tous les événements de Java AWT et Swing Hériter en fin de compte EventObject, et la convention est d'appeler l'auditeur SomethingListener et l'événement SomethingEvent. Bien que vous puissiez vous permettre de nommer votre code comme vous le souhaitez, il est plus facile de maintenir un code qui colle aux conventions de la plateforme.

Questions connexes