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

时间:2015-06-02 11:33:53

标签: c# design-patterns static

我知道如何实现Command Design模式如下:

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()将从委托中的事件运行。)

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

3 个答案:

答案 0 :(得分:8)

代理是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.
    }
}

答案 1 :(得分:0)

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

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

然后使用它:

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

它非常有效,因为您的处理器可以有效地使用“管道和过滤器”模式来增加横切关注点。

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

答案 2 :(得分:0)

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

Bob Bystrom的一些链接。 使用闭包:

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以触发相应的事件。