如果我有处理命令和处理的应用程序,是否应该使用合适的设计模式,因为目前我有很长的 switch case 语句?
switch(command)
{
case ACK : // process(); break;
case NAK : // process(); break;
case POLL: // process(); break;
...
}
如果我有处理命令和处理的应用程序,是否应该使用合适的设计模式,因为目前我有很长的 switch case 语句?
switch(command)
{
case ACK : // process(); break;
case NAK : // process(); break;
case POLL: // process(); break;
...
}
你绝对可以在这里做一些事情。如果它真的像将命令绑定到值一样简单,您可以使用 simpleDictionary
将命令名称绑定到它执行的委托,例如:
private static IDictionary<string, Action> _actionsByCommand;
static MyClass() {
_actionsByCommand[ACK] = Acknowledge;
_actionsByCommand[POLL] = Poll;
}
private static void Acknowledge() { }
private static void Poll() { }
static void Main() {
string command = ...;
_actionsByCommand[command]();
}
或者代替委托,您可以使用共享的基类或接口为每个命令定义类,并使用Go
某种执行的方法。如果您以后需要,这将使您受益于将附加属性或值绑定到每个命令。
假设您有三个具有相同签名的方法。
public Func<string, int> Ack = (i) => return 1;
public Func<string, int> Nack= (i) => return 1;
public Func<string, int> Poll = (i) => return 1;
并且您想在没有 case 语句的情况下调用它们。
public int Call(string commandName)
{
//Find method
var method = this.GetType().GetFields().First(x=>x.Name == commandName);
if (method == null) return null;
//Convert it to Func
var m = (Func<string, int>) method.GetValue(this);
return m.Invoke("");
}
你会像使用它一样。
new MethodRunner().Call("Ack");