我知道如何实现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()将从委托中的事件运行。)
我如何重新创建这种设计模式,但允许静态调用方法?
答案 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以触发相应的事件。