使用静态方法 C# 实现命令设计模式

Implementing a Command Design Pattern with static methods C#

我知道如何实现命令设计模式如下:

public abstract class Command
{
   public abstract void Execute(string someString);
}

说我继承了这个,举个例子:

public class ConnectionCommand : Command
{
   public override void Execute(string connectionString)
   {
      ...do some stuff here...;
   }
}

问题是使用此 ConnectionCommand 我需要首先实例化一个对象,但这些命令是上下文无关的,因此我宁愿不必为 运行 ConnectionCommand 的 Execute 方法实例化任何内容。 (P.S。ConnectionCommand.Execute() 将 运行 来自委托中的事件。

我如何重新创建这种设计模式但允许静态调用这些方法?

委托是命令模式的 C# 内置实现。为什么要重新发明轮子;使用自动支持静态纯函数的委托。

所以你有一个事件系统,这些事件调用委托。不过,您需要那些代表拥有状态,而不需要创建某些 class 的实例。这就是闭包发挥作用的地方。例如:

public class SomeClass
{
    public static CreateCommand(SomeType state, SomeEventHandler eventHandler)
    {
        eventHandler += (s, e) => MyDelegate(state, s, e);
    }

    private static void MyDelegate(SomeType state, object sender, EventArgs e)
    {
        // do something with state, when the event is fired.
    }
}

当我使用这个模式时,我使用了一个'CommandProcessor':

class CommandProcessor
{
    static void Execute(ICommand command)
    {
        command.Execute();
    }
}

然后这样使用:

CommandProcessor.Execute(new ConnectionCommand {PropertyX = 1, ProperyY = 2});

它工作得很好,因为您的处理器可以有效地使用 'pipe and filter' 模式来添加横切关注点。

它可以通过 parameters/return 值的泛型和重载等得到增强

http://journal.stuffwithstuff.com/2009/07/02/closures-and-the-command-pattern/

A link Bob Nystrom 的一些作品。 使用闭包:

static class Commands
{
    // create a command to move a piece
    public static Action MovePiece(Piece piece, int x, int y)
    {
        return () => piece.MoveTo(x, y);
    }
}

class Program
{
    public static Main(string[] args)
    {
        // ui or ai creates command
        var piece = new Piece();
        var command =  Commands.MovePiece(piece, 3, 4);

        // chess engine invokes it
        command();
    }
}

使用闭包和工厂在 C# 中执行命令设计模式的一种非常巧妙的方法,类似于上面的答案,但没有状态信息。为了完整起见,我还是添加了它。 Commands.MovePiece 然后可以订阅适当的事件来触发。