使用静态方法 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 然后可以订阅适当的事件来触发。
我知道如何实现命令设计模式如下:
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 然后可以订阅适当的事件来触发。