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

时间:2009-05-20 18:17:25

标签: command-pattern design-patterns

在命令模式中:

为什么客户参与者不应该与调用者参与者是同一个类?是否存在客户参与者和调用者参与者可能属于同一类的情况?

3 个答案:

答案 0 :(得分:4)

最大的原因是它违反了单一责任原则。客户参与者和投诉人参与者都有个人责任,而对一方的更改将影响另一方。

答案 1 :(得分:0)

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

例如,它可能是这样的

class Client {

...

invoker.executeCommand()

...

}

2)Invoker的主要职责是按特定顺序调用Command Object的一个或多个命令方法。

例如,

class Invoker {

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

}

让我们考虑一下java.awt.event.KeyListener类。它有三种方法按以下顺序调用:

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

此侦听器的Invoker类可以是:

class KeyInvocation {
    KeyListener listener;

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

同时客户端类应该正确设置EventObject,KeyListener和KeyInvocation,然后在适当的位置和时间执行invokeKey方法。

当然,Invoker是Command模式的附加层。 在Command模式的简单情况下,我们可以跳过Invoker类,并在Client one中完成所有工作。

答案 2 :(得分:0)

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

这恰好回答了您的问题,即调用者和客户端可以如何不同