2009-05-20 10 views
1

Dans le modèle de commande:Motif de commande: client et invocateur

Pourquoi le participant client ne devrait-il pas être de la même classe que le participant invocateur? Existe-t-il des scénarios possibles lorsque le participant client et le participant invocateur peuvent être de la même classe?

+0

Copie possible de [Motif de conception de commande - Invocation facultative?] (Http://stackoverflow.com/questions/12879609/command-design-pattern-is-invoker-optional). C'est plus tôt, mais l'autre a plus d'infos. – outis

Répondre

4

La raison la plus importante est qu'elle enfreint le principe de la responsabilité unique. Le participant client et le participant invocateur ont tous les deux des responsabilités individuelles et un changement à l'un affectera l'autre.

0

1) La responsabilité principale pour le client est de mettre en place correctement les objets Invocateur, Destinataire et Commandement, puis d'initier la procédure d'exécution au lieu et à l'heure appropriés.

Il pourrait, par exemple, quelque chose comme ça

class Client { 

... 

invoker.executeCommand() 

... 

} 

2) la responsabilité principale de Invocateur est d'invoquer une ou plusieurs méthodes de commande-commande objet dans un ordre particulier.

Par exemple,

class Invoker { 

... 
command.command1(); 
command.command2(); 
command.command3(); 
... 

} 

Considérons, par exemple, la classe java.awt.event.KeyListener. Il dispose de trois méthodes qui est invoquée dans l'ordre suivant:

keyPressed(KeyEvent e) 
keyTyped(KeyEvent e) 
keyReleased(KeyEvent e) 

classe Invocateur pour cet auditeur pourrait être:

class KeyInvocation { 
    KeyListener listener; 

    void invokeKey(EventObject e) { 
     listener.keyPressed(e); 
     listener.keyTyped(e); 
     listener.keyReleased(e); 
    } 
} 

Meantime classe Client doit instancie appropriée ObjetEvenement, KeyListener et KeyInvocation puis exécuter en bonne place et temps méthode invokeKey.

Bien sûr, l'invocateur est une couche supplémentaire de motif de commande. Dans un cas plus simple de modèle de commande, nous pouvons ignorer la classe Invoker et faire tout le travail dans le client un.

Questions connexes