【问题标题】:Is the Command pattern or the Strategy pattern more appropriate for client-server calls?命令模式还是策略模式更适合客户端-服务器调用?
【发布时间】:2014-08-20 02:17:20
【问题描述】:

我需要在求职面试期间创建一个客户端-服务器程序,其中客户端发送命令,服务器处理它们。

服务器需要能够轻松更改,这意味着以后可能会有更多的命令类型。

所以我使用 Strategy 来实现它,这意味着类处理命令看起来类似于:

public class ServerProcessor
{
    Dictionary<string, Action<string>> commandsType;

    public ServerProcessor()
    {
        commandsType = new Dictionary<string, Action<string>>();
    }

    public void RegisterCommand(string commandName, Action<string> command)
    {
        commandsType.Add(commandName, command);
    }

    public void Process(string commandName, string vars)
    {
        if (commandsType.ContainsKey(commandName))
        {
            commandsType[commandName].Invoke(vars);
        }
    }
}

在我这样做之后,面试官说我需要使用命令模式来实现它,但没有说明原因。

命令模式将是这样的:

public interface ICommand
{
    void Execute(string vars);
    string GetName();
}

public class ServerProcessor2
{
    List<ICommand> commandsType;

    public ServerProcessor2()
    {
        commandsType = new List<ICommand>();
    }

    public void RegisterCommand(ICommand commandName)
    {
        commandsType.Add(commandName);
    }

    public void Process(string commandName, string vars)
    {
        foreach (ICommand item in commandsType)
        {
            string name = item.GetName();

            if (name.Equals(commandName))
            {
                item.Execute(vars);
            } 
        }
    }
}

在这种情况下命令模式更好的原因是什么,还是只是面试官的观点?

【问题讨论】:

  • 我认为你问的问题太宽泛了。我不确定面试官是否足够清楚地提出了这个问题,是否有足够的要求来证明对战略的指挥是合理的。面试官也是人,而且以提出不好的问题而臭名昭著。很难正确地设置问题以使模式显而易见(不要太明显)。
  • @Fuhrmanator,我已经看到你提到的问题,但我的问题很具体,不像“有什么区别”那么广泛,我只想说这是我希望的问题听到,或了解我的错误。

标签: c# design-patterns strategy-pattern command-pattern


【解决方案1】:

你的两个例子非常相似。它们都使用策略模式,而不是命令模式。

策略封装了一个过程,该过程具有给定类型的输入和另一种给定类型的输出。通常策略的选择取决于输入。

命令模式将系统上的操作表示为易于构造、传输和持久化的对象,因此您可以将它们附加到 UI 元素、对它们进行排队、记录它们、将它们用作撤消的基础等。

您的示例都使用带有命令名称的字符串和带有参数的字符串。命令模式将为每个命令使用不同的类(具有公共超类),并将参数作为对象的属性包含在内。您的示例都使用 Strategy 来执行每个命令;在第一个示例中,您的策略是操作,而在第二个示例中,策略是(有点误导)ICommands。您的示例实际上仅在名称上有所不同,其中一个将其策略存储在字典中,另一个将其存储在列表中。

现在来实际回答您的问题:问题描述中没有任何内容需要使用任何一种模式。命令是客户端-服务器接口的一个很好的模式,因为它启用了我上面提到的东西,而策略是执行命令的一个很好的模式,所以使用两者都是一个不错的选择。然而,两者都不是必需的,据我们所知,Command 只是你面试官的选择(可能是因为他们想知道你是否知道)。

【讨论】:

    【解决方案2】:

    Command processor pattern 面向服务器处理长时间运行的命令。这绝对是命令而不是策略,因为它是GoF Command 的变体。

    面试是面向 Android 的吗?

    【讨论】:

      【解决方案3】:

      在这种情况下使用命令模式的一个好处是可以“撤消”某些操作。如果您的 ICommand 接口实现为:

      public interface ICommand
      {
          void Execute(string vars);
          void Undo();
          string GetName();
      }
      

      当您创建此接口的具体实现时,为每种类型的命令添加撤消逻辑很容易。例如。如果该命令将一些文本添加到文档中,撤消操作会删除该文本。命令的上下文保存在命令对象中。

      服务器可以在执行后将具体的命令对象添加到堆栈中。如果需要撤消操作,只需调用类似以下的代码即可:

      executedCommandsStack.pop().undo();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 2010-10-27
        • 2011-07-27
        • 2011-04-22
        相关资源
        最近更新 更多