2013-03-27 41 views
0

如果我有處理命令和處理的應用程序,是否應該使用適當的設計模式,因爲目前我有一個長開關case語句?哪種設計模式可以申請處理命令應用程序?

開關(命令)

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

預先感謝。

+0

參見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

回答

1

你絕對可以在這裏做一些事情。如果這是真的搭售命令的值一樣簡單,你可以使用一個簡單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方法可以執行。如果你需要它,這會給你帶來與每個命令相關的附加屬性或值的好處。

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

Command Pattern可能是有用的。你可以谷歌它並找到大量的例子。

相關問題