在命令模式中:
为什么客户端参与者不应该与调用者参与者是同一类?当客户端参与者和调用者参与者可以是同一个类时,是否存在可能的场景?
在命令模式中:
为什么客户端参与者不应该与调用者参与者是同一类?当客户端参与者和调用者参与者可以是同一个类时,是否存在可能的场景?
最大的原因是它违反了单一责任原则。客户参与者和调用者参与者都有各自的责任,对其中一个的更改将影响另一个。
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 类并在客户端一中完成所有工作。
因此,让我们以文本编辑器为例。当您打开一个应用程序时,该应用程序就是客户端,它将在调用程序中存储各种接收器和命令。例如。它会将 pasteCommand 添加到接收者是文档的粘贴菜单项。它将 openCommand 添加到打开菜单项,其中接收者是应用程序本身。
这完全回答了您的问题,调用者和客户端如何不同