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

本文关键字:命令 设计模式 实现 静态方法 | 更新日期: 2023-09-27 17:52:45

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

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方法。(注:ConnectionCommand.Execute()将在委托中从事件中运行)。

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

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

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

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

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});

它可以很好地工作,因为你的处理器可以有效地使用"管道和过滤器"模式来添加横切关注点。

它可以通过泛型和参数/返回值的重载等来增强。

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

链接到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#中使用闭包和工厂来实现命令设计模式的一种非常简洁的方法,类似于上面的答案,但没有状态信息。但是为了完整性,我还是添加了它。的命令。MovePiece可以订阅一个合适的事件来触发。