2009-05-20 65 views
1

在命令模式中:命令模式:客户端和调用者

为什么客户端参与者不应该与调用者参与者具有相同的类?当客户参与者和调用者参与者可以是同一个类时,是否有可能的情景?

+0

[Command Design Pattern - Is Invoker Optional?]的可能的副本(http://stackoverflow.com/questions/12879609/command-design-pattern-is-invoker-optional)。这是更早,但其他有更多的信息。 – outis 2015-07-18 21:03:18

回答

4

最大的原因是它违反了单一责任原则。客户参与者和调解者参与者都有各自的责任,并且对其中一个的改变会影响另一个。

0

1)客户的主要责任是正确实施Invoker,Receiver和Command对象,然后在适当的地点和时间启动执行程序。

它可以,例如,是这样的祈求这个

class Client { 

... 

invoker.executeCommand() 

... 

} 

2)主要职责是在调用特定的顺序Command对象的一个​​或多个命令的方法。

例如,

class Invoker { 

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

} 

让我们考虑,例如,java.awt.event.KeyListener类。它是按照下面的顺序调用三种方法:

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

这个监听器祈求类可能是:正确实例化的EventObject,KeyListener的和KeyInvocation然后

class KeyInvocation { 
    KeyListener listener; 

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

与此同时Client类应在适当的执行地点和时间invokeKey方法。

当然,Invoker是命令模式的附加层。 在Command模式更简单的情况下,我们可以跳过Invoker类并完成客户端的所有工作。