感觉最后的代码还是不够干净,或者说其中的语句的抽象层次不一致,大概应该这样
while (true)
{
//get input
//process input to return normalized CommandName and arguments
//get a command object based CommandName
//Execute the command object with the arguments
}
大概的实现:
interface ICommand
{
void Execute(params object[] parameters);
}
....
class EchoCommand : ICommand
{
void Execute(params object[] parameters)
{
foreach(object o in parameters)
Console.WriteLine(o);
}
}
class ExitCommand : ICommand
{
void Execute(params object[] parameters)
{
Environment.Exit(-1);
}
}
....
这二个类使用你的配置文件来处理命令和取得ICommand对象,也许应该合二为一,分成2个是因为两者的职责不同,虽然都依赖于配置文件中的同个配置
static class InputProcessor
{
public static void GetCommand(string input, out string commandName, out object[] parameters)
{
//根据配置文件里设置的命令,得到规范的commandName,并且把剩余的字符串变成参数,object[] parameters?还是应该是string [] parameters?
}
//如果更复杂的话,也许应该改成非静态类,从配置文件中获得一个InputProcessingStrategy对象,传入构造器,负责怎么把用户的输入转换成一个命令和一堆参数
}
static class CommandFactory
{
public static ICommand GetCommand(string commandName)
{
//根据配置文件里和commandName转换成ICommand对象
}
}
客户端代码:
string input,commandName;
object[] parameters;
while (true)
{
input = Console.ReadLine();
InputProcessor.GetCommand(input, out commandName, out parameters);
ICommand cmd = CommandFactory(commandName);
cmd.Execute(parameters);
}
这么做的话,如果要增加一个Command,你只要新建一个Command对象,更新配置文件即可
回复 引用