【问题标题】:Command Pattern: Client and Invoker命令模式:客户端和调用者
【发布时间】:2010-10-27 17:28:16
【问题描述】:

在命令模式中:

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

【问题讨论】:

标签: command-pattern design-patterns


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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 中完成所有工作。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 2014-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        相关资源
        最近更新 更多