我的帖子的标题可能不是合适的,我最近遇到了一个设计问题,虽然我认为这是一个很常见的但我不太确定如何解决它。
我有两种类型的命令集。
第一种类型的示例:
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
不需要操作任何数据,因此完全没有必要传递参数。但我的设计迫使我通过它。什么是解决这个问题的更好方法。
答案 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();
}