用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#命令模式的内置实现。为什么要重新发明轮子;使用委托,它自动支持静态纯函数。
你有一个事件系统,那些事件调用委托。但是,您需要这些委托具有状态,而不需要创建某些类的实例。这就是闭包发挥作用的地方。例如:
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可以订阅一个合适的事件来触发。