处理命令应用程序可以申请哪种设计模式?

本文关键字:设计模式 命令 应用程序 处理 | 更新日期: 2023-09-27 18:06:21

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

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

处理命令应用程序可以申请哪种设计模式?

您肯定可以在这里做一些事情。如果它真的像将命令绑定到一个值一样简单,您可以使用简单的Dictionary将命令名称绑定到它执行的委托,如:

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");