如何解耦模式切换和命令

如何将模式(通常由枚举表示)与命令及其关系中的实现分离? 它们是一个很好的模式,用于描述模式开关(int,enum,string,…)与其命令调用之间的松散绑定吗? 我想通过配置添加模式,因此必须(动态)轻松扩展(无需编程)。 我已经知道命令模式(C#/ .Net中的ICommand)。 它可能是一个命令字典及其相关的模式编号,但是切换逻辑呢?

可以将上下文(切换脱离,参数)与策略分离以解决请求(输入)及其响应(输出)。

您可以使用例如generics来解决具有一个代码库的不同情况下的此问题。 例如,策略由其输入和输出类型以及要评估的条件定义:

public class Strategy { public Predicate Condition { get; private set; } public Func Result { get; private set; } public Strategy(Predicate condition, Func result) { Condition = condition; Result = result; } public TOutput Evaluate(TInput input) { return Condition(input) ? Result(input) : default(TOutput); } } 

上下文有不同的策略,并询问他们的责任策略(给定条件是可以的,可以计算请求的结果)。

 public class Context { private List> Strategies { get; set; } public Context(params Strategy[] strategies) { Strategies = strategies.ToList(); } public TOutput Evaluate(TInput input) { var result = default(TOutput); foreach (var strategy in Strategies) { result = strategy.Evaluate(input); if (!Equals(result, default(TOutput))) break; } return result; } } 

让我们举一个简单的例子,其中输入字符串需要解析为输出字符串(如switch case)。

1.定义你的动作 (为了简化这是一个(你可以看到,每个方法都有自己的逻辑和关注点):

  private static string Move(string s) { if (s == "move") return "doMove"; // here could be some more action... return null; } private static string Query(string s) { if (s == "point") return "queryPoint"; // here could be some more action... return null; } 

2.定义运行评估的条件 (lika a ICOMmand的CanExecute):

  private static bool Condition(string s) { return !string.IsNullOrEmpty(s); // could eval different states, values } 

…你甚至可以定义更多条件(例如每个策略一个条件评估函数),但我们在这里只使用一个条件。

3.创建上下文所需的策略对象 (这些符号表示交换机的不同路径,它们为我们提供结果):

  var navigate = new Strategy(Condition, Move); var query = new Strategy(Condition, Query); 

2.初始化上下文 (用输入表示开关体):

  var strategies = new List> {navigate, query}; var context = new Context(strategies.ToArray()); 

3.将它们连接到代码中 (例如,通过单击按钮执行“switch”):

  private void ButtonClick(object sender, RoutedEventArgs e) { var message = context.Evaluate(textBox1.Text); if (message != null) MessageBox.Show(message); // display result } 

… 而已。

上下文为您提供了正确的策略(可以执行正确的操作或提供执行某些操作所需的“工具”(例如ICommand)。