1

在命令模式中:

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

4

3 回答 3

6

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

于 2009-05-20T18:24:47.797 回答
0

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 类并在客户端一中完成所有工作。

于 2015-08-29T22:50:34.440 回答
0

因此,让我们以文本编辑器为例。当您打开一个应用程序时,该应用程序就是客户端,它将在调用程序中存储各种接收器和命令。例如。它会将 pasteCommand 添加到接收者是文档的粘贴菜单项。它将 openCommand 添加到打开菜单项,其中接收者是应用程序本身。

这完全回答了您的问题,调用者和客户端如何不同

于 2019-12-02T02:14:41.157 回答