0

如果我有处理命令和处理的应用程序,是否应该使用合适的设计模式,因为目前我有很长的 switch case 语句?

switch(command)

{
   case ACK : // process(); break;
   case NAK : // process(); break;
   case POLL: // process(); break;
   ...
}
4

2 回答 2

0

你绝对可以在这里做一些事情。如果它真的像将命令绑定到值一样简单,您可以使用 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某种执行的方法。如果您以后需要,这将使您受益于将附加属性或值绑定到每个命令。

于 2013-03-27T14:38:19.803 回答
0

假设您有三个具有相同签名的方法。

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");
于 2013-03-27T14:38:46.557 回答