处理命令应用程序可以申请哪种设计模式?
本文关键字:设计模式 命令 应用程序 处理 | 更新日期: 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");