【发布时间】:2010-10-27 17:28:16
【问题描述】:
在命令模式中:
为什么客户端参与者不能和调用者参与者是同一个类?是否存在客户端参与者和调用者参与者可以是同一个类的情况?
【问题讨论】:
-
Command Design Pattern - Is Invoker Optional? 的可能重复项。这是较早的,但另一个有更多信息。
标签: command-pattern design-patterns
在命令模式中:
为什么客户端参与者不能和调用者参与者是同一个类?是否存在客户端参与者和调用者参与者可以是同一个类的情况?
【问题讨论】:
标签: command-pattern design-patterns
最大的原因是它违反了单一责任原则。 Client 参与者和 Invoker 参与者都有各自的责任,对其中一个的更改会影响另一个。
【讨论】:
1) Client 的主要职责是正确实例化 Invoker、Receiver 和 Command 对象,然后在适当的时间和地点启动执行过程。
例如,它可能是这样的
class Client {
...
invoker.executeCommand()
...
}
2) Invoker 的主要职责是按特定顺序调用命令对象的一个或多个命令方法。
例如,
class Invoker {
...
command.command1();
command.command2();
command.command3();
...
}
让我们以 java.awt.event.KeyListener 类为例。它具有三个按以下顺序调用的方法:
keyPressed(KeyEvent e)
keyTyped(KeyEvent e)
keyReleased(KeyEvent e)
此侦听器的调用程序类可能是:
class KeyInvocation {
KeyListener listener;
void invokeKey(EventObject e) {
listener.keyPressed(e);
listener.keyTyped(e);
listener.keyReleased(e);
}
}
同时,Client 类应该适当地实例化 EventObject、KeyListener 和 KeyInvocation,然后在适当的地点和时间执行 invokeKey 方法。
当然 Invoker 是命令模式的附加层。 在命令模式的更简单情况下,我们可以完全跳过 Invoker 类并在 Client one 中完成所有工作。
【讨论】:
让我们举一个文本编辑器的例子。当您打开一个应用程序时,该应用程序就是客户端,它将在调用程序中存储各种接收器和命令。例如。它会将 pasteCommand 添加到接收者是文档的粘贴菜单项。它将添加 openCommand 以打开菜单项,其中接收者是应用程序本身。
这完全回答了您的问题,调用者和客户端如何不同
【讨论】: