Command模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在C#编程中,利用.NET框架的特性,如委托和泛型,我们可以优雅地实现Command模式。
我们来理解Command模式的基本结构。模式包含以下几个角色:
1. **Command**(命令):声明一个接口,用于接收执行请求的方法。
2. **ConcreteCommand**(具体命令):实现了Command接口,知道如何接收请求并调用接收者的相应操作。
3. **Invoker**(调用者):持有Command对象并调用其Execute方法来执行请求。
4. **Receiver**(接收者):知道如何执行与请求相关的操作。
在C#中,我们可以使用委托作为Command接口的实现,因为它可以表示一个方法调用。例如:
```csharp
public delegate void Command(object parameter);
```
接下来,创建具体的命令类,如`ConcreteCommandA`和`ConcreteCommandB`,它们分别实现特定的功能:
```csharp
public class ConcreteCommandA : Command
{
private Receiver _receiver;
public ConcreteCommandA(Receiver receiver)
{
_receiver = receiver;
}
public override void Execute(object parameter)
{
_receiver.ActionA(parameter);
}
}
public class ConcreteCommandB : Command
{
private Receiver _receiver;
public ConcreteCommandB(Receiver receiver)
{
_receiver = receiver;
}
public override void Execute(object parameter)
{
_receiver.ActionB(parameter);
}
}
```
接收者类`Receiver`包含命令需要执行的具体操作:
```csharp
public class Receiver
{
public void ActionA(object parameter)
{
// 执行操作A
}
public void ActionB(object parameter)
{
// 执行操作B
}
}
```
调用者`Invoker`持有命令对象并调用`Execute`方法:
```csharp
public class Invoker
{
private Command _command;
public void SetCommand(Command command)
{
_command = command;
}
public void ExecuteCommand()
{
_command.Execute(null); // 可以传递参数
}
}
```
现在,你可以根据需求创建不同的具体命令实例,并在调用者中设置它们:
```csharp
public static void Main(string[] args)
{
Receiver receiver = new Receiver();
Invoker invoker = new Invoker();
invoker.SetCommand(new ConcreteCommandA(receiver));
invoker.ExecuteCommand(); // 执行操作A
invoker.SetCommand(new ConcreteCommandB(receiver));
invoker.ExecuteCommand(); // 执行操作B
}
```
至于泛型,它允许Command模式更加灵活。通过定义泛型委托,你可以创建能处理不同类型命令的通用命令接口。例如:
```csharp
public delegate void GenericCommand(T parameter);
```
这样,`ConcreteCommandA`和`ConcreteCommandB`可以修改为接受特定类型参数:
```csharp
public class ConcreteCommandA : GenericCommand
{
private Receiver _receiver;
public ConcreteCommandA(Receiver receiver)
{
_receiver = receiver;
}
public override void Invoke(T parameter)
{
_receiver.ActionA(parameter);
}
}
// 类似地,为ConcreteCommandB实现
```
通过这种方式,Command模式在C#中的实现结合了.NET的委托和泛型,使得代码更加灵活、易于扩展和维护。同时,提供的示例代码如`Command_Demo.zip`、`Command_cs.zip`和`An-implementation-of-Command-pattern-in-C.pdf`将提供更深入的实践理解和应用案例。
1