Please enable Javascript to view the contents

C# 命令模式

 ·  ☕ 3 分钟  ·  ✍️ YSL

在C#中,命令模式(Command Pattern)是一种行为型设计模式,它将请求和处理请求的对象分离,并封装请求为一个对象,从而允许程序员将请求参数化、延迟执行请求或将请求放入队列中等高级操作。命令模式的核心思想是将请求看作一个对象,从而使得请求可以被封装、传递和操作,而不必涉及请求的具体内容。在C#中,可以使用以下方式实现命令模式:

  1. 定义命令接口:在C#中,可以定义一个命令接口,该接口包含一个执行方法,用于执行命令。例如:
1
2
3
public interface ICommand {
    void Execute();
}

在以上示例中,我们定义了一个 ICommand 接口,它包含一个 Execute 方法,用于执行命令。

  1. 创建具体命令类:在C#中,可以创建一个或多个具体命令类,来实现 ICommand 接口,并封装具体的命令操作。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class ConcreteCommand : ICommand {
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }

    public void Execute() {
        receiver.Action();
    }
}

在以上示例中,我们创建了一个 ConcreteCommand 类,它实现了 ICommand 接口,并包含一个 Receiver 类型的成员变量 receiver。在 ConcreteCommand 类的构造函数中,我们传入一个 Receiver 类型的参数 receiver,并将其赋值给成员变量。Execute 方法用于调用 receiver 的 Action 方法,以实现具体的命令操作。

  1. 创建接收者类:在C#中,可以创建一个接收者类,用于实现具体的命令操作。例如:
1
2
3
4
5
public class Receiver {
    public void Action() {
        Console.WriteLine("Action executed");
    }
}

在以上示例中,我们创建了一个 Receiver 类,它包含一个 Action 方法,用于实现具体的命令操作。

  1. 创建调用者类:在C#中,可以创建一个调用者类,用于调用命令并执行相应的操作。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Invoker {
    private ICommand command;

    public void SetCommand(ICommand command) {
        this.command = command;
    }

    public void ExecuteCommand() {
        command.Execute();
    }
}

在以上示例中,我们创建了一个 Invoker 类,它包含一个 ICommand 类型的成员变量 command。SetCommand 方法用于设置 command 的值,ExecuteCommand 方法用于调用 command 的 Execute 方法,以执行相应的操作。

  1. 使用命令模式:在C#中,可以创建具体的命令对象、接收者对象和调用者对象,并使用它们来执行具体的命令操作。例如:
1
2
3
4
5
6
Receiver receiver = new Receiver();
ICommand command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();

invoker.SetCommand(command);
invoker.ExecuteCommand(); // 输出 "Action executed"

在以上示例中,我们创建了一个 Receiver 对象 receiver、一个 ConcreteCommand 对象 command,以及一个 Invoker 对象 invoker。然后,我们将 command 对象设置为 invoker 的 command 成员变量,最后调用 invoker 的 ExecuteCommand 方法,以执行具体的命令操作。

需要注意的是,在使用命令模式时,应该避免将过多的逻辑封装在命令对象中,以免影响程序的可读性和可维护性。命令对象应该尽可能简单,只包含必要的处理逻辑,并将复杂的操作委托给其他对象来完成。另外,在使用命令模式时,应该注意命令对象的生命周期和作用域,以确保程序的正确性和稳定性。