2013-03-27 3 views
0

Если у меня есть приложение обработки команд и обработки, есть ли подходящий шаблон проектирования, который я должен использовать, потому что в настоящее время у меня есть длинный оператор case 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

ответ

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; 

и вы хотите назвать их без заявления о случаях.

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 может быть пригодится. Вы можете использовать Google и найти множество примеров.

Смежные вопросы