📜  路线中的工匠命令 - C# (1)

📅  最后修改于: 2023-12-03 15:12:15.662000             🧑  作者: Mango

路线中的工匠命令 - C#

路线中的工匠命令(Command-Query Separation Pattern)是一种软件设计模式,它强调对查询(查询)和命令(命令)的明确区分。在C#中,该模式可以通过接口,委托和lambda表达式实现。

接口实现
public interface ICommand
{
  void Execute();
}

public interface IQuery<out TResult>
{
  TResult Execute();
}

public class ConcreteCommand : ICommand
{
  private readonly string _message;

  public ConcreteCommand(string message)
  {
      _message = message;
  }

  public void Execute()
  {
      Console.WriteLine(_message);
  }
}

public class ConcreteQuery : IQuery<string>
{
  public string Execute()
  {
      return “Hello World”;
  }
}

在上面的示例中,我们定义了两个接口ICommand和IQuery,它们都是接受无参数和返回void或者TResult的方法。然后我们定义了从接口派生的具体实现。ConcreteCommand实现了ICommand,执行它自己的方法并打印出一条消息。ConcreteQuery实现了IQuery,返回一个字符串“Hello World”。

委派实现
public delegate void Command();

public delegate TResult Query<out TResult>();
  
public class AnotherConcreteCommand
{
  public void Execute()
  {
      Console.WriteLine(“Hello World”);
  }
}

public class AnotherConcreteQuery
{
  public string Execute()
  {
      return “Hello World”;
  }
}

以上代码示例中,我们定义了Command和Query委托类型,它们都是无参数委托,一个返回void,一个c放回TResult。然后我们定义另一个具体实现AnotherConcreteCommand和AnotherConcreteQuery。AnotherConcreteCommand实现了 Command委托,执行自己的方法并打印出一条消息。AnotherConcreteQuery实现了Query类型的委托,返回一个字符串“Hello World”。

Lambda表达式实现
public class LambaCommandQuery
  {
    public static Func<int, int> LambdaQuery = (x) => x * 2;

    public static Action<string> LambdaCommand = (message) =>
    {
        Console.WriteLine(message);
    };
  }

在上面的示例中,我们定义了LambdaQuery和LambdaCommand,它们分别是Func<int, int>和Action类型的变量。LambdaQuery是一个用于查询的lambda表达式,它将输入的数字乘以2并返回。LambdaCommand是一个用于命令的lambda表达式,它输出传入的字符串。

结论

在C#中实现路线中的工匠命令模式的方法有很多种。我们可以通过接口,委托和lambda表达式等方式实现它。任何一种方式都可以帮助我们更好地实现命令和查询之间的分离,让软件变得更加可维护和可扩展。