策略模式:相同的功能组但需要不同数量的参数

时间:2018-03-27 14:40:53

标签: c# design-patterns

我的帖子的标题可能不是合适的,我最近遇到了一个设计问题,虽然我认为这是一个很常见的但我不太确定如何解决它。

我有两种类型的命令集。

第一种类型的示例:

  

create_room 4

在上面的命令create_room中是命令,4是将要执行操作的数据。

第二种类型的示例:

  

出口

不接受任何数据操作。

我的策略是:

public interface ICommandExecutor
{
    stirng Execute (string command);
}
public class CreateRoom : ICommandExecutor
{
    public string Execute (string command)
    {
        //do the job
    }
}
public class Exit : ICommandExecutor
{
    public string Execute (string command)
    {
        //do the job
    }
}

在此之前,我有一个工厂来决定根据命令输入调用哪个版本的实现。

ICommandExecutor executor = null;
if (command.Contains("exit"))
{
    executor = new Exit();
}
else if (command.Contains("create_room"))
{
    executor = new CreateRoom();
}

现在我的问题在于类Exit的实现。 方法public string Execute (string command)采用参数。命令本身是哪个;如果我们有任何数据要操作(如create_room 4)。命令exit不需要操作任何数据,因此完全没有必要传递参数。但我的设计迫使我通过它。什么是解决这个问题的更好方法。

1 个答案:

答案 0 :(得分:0)

命令模式应该封装整个命令,包括其参数。您应该能够序列化命令,将其存储在某个地方,还原它,反序列化它,仍然执行它

因此,要正确使用Command模式,请创建命令的参数属性,而不是Execute()的参数:

public interface ICommandExecutor
{
    string Execute ();
}
public class CreateRoom : ICommandExecutor
{
    public string RoomName { get; set; }

    public string Execute ()
    {
        //do the job
    }
}
public class Exit : ICommandExecutor
{
    public string Execute ()
    {
        //do the job
    }
}

然后它的用法:

ICommandExecutor executor = null;
if (command.Contains("exit"))
{
    executor = new Exit();
}
else if (command.Contains("create_room"))
{
    executor = new CreateRoom()
    {
        RoomName = // get room name from command, perhaps using a regex?
    };
}

if (executor != null)
{
    executor.Execute();
}