如果我有處理命令和處理的應用程序,是否應該使用適當的設計模式,因爲目前我有一個長開關case語句?哪種設計模式可以申請處理命令應用程序?
開關(命令)
{
case ACK : // process(); break;
case NAK : // process(); break;
case POLL: // process(); break;
...
}
預先感謝。
如果我有處理命令和處理的應用程序,是否應該使用適當的設計模式,因爲目前我有一個長開關case語句?哪種設計模式可以申請處理命令應用程序?
開關(命令)
{
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");
Command Pattern
可能是有用的。你可以谷歌它並找到大量的例子。
參見http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91和http://en.wikipedia.org/wiki/Command-query_separation – Maarten 2013-03-27 14:42:03