命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许您将不同的请求参数化、队列化,并且能够在不同的时间点执行。通过引入命令对象(Command)来解耦发送者(Invoker)和接收者(Receiver),使得发送者无需知道具体的接收者或操作细节。命令对象封装了一系列操作,并提供了一个统一的方法(如execute()
),以便调用这些操作。
- import java.util.ArrayList;
- import java.util.List;
-
- // 抽象命令接口
- interface Command {
- void execute();
- }
-
- // 具体命令类1
- class ConcreteCommand1 implements Command {
- private Receiver receiver;
-
- public ConcreteCommand1(Receiver receiver) {
- this.receiver = receiver;
- }
-
- @Override
- public void execute() {
- receiver.action1();
- }
- }
-
- // 具体命令类2
- class ConcreteCommand2 implements Command {
- private Receiver receiver;
-
- public ConcreteCommand2(Receiver receiver) {
- this.receiver = receiver;
- }
-
- @Override
- public void execute() {
- receiver.action2();
- }
- }
-
- // 接收者类
- class Receiver {
- public void action1() {
- System.out.println("执行操作1");
- }
-
- public void action2() {
- System.out.println("执行操作2");
- }
- }
-
- // 调用者类/发送者类/Invoker类
- class Invoker {
- private List
commands = new ArrayList<>(); -
- // 添加命令到队列中
- public void addCommand(Command command) {
- commands.add(command);
- }
-
- // 执行所有的命令
- public void executeCommands() {
- for (Command command : commands) {
- command.execute();
- }
- commands.clear(); // 清空已执行的命令列表,可选操作。
- }
- }
-
- public class Main {
-
- public static void main(String[] args) {
- // 创建接收者对象
- Receiver receiver = new Receiver();
-
- // 创建具体命令对象并指定接收者
- Command command1 = new ConcreteCommand1(receiver);
- Command command2 = new ConcreteCommand2(receiver);
-
- // 创建调用者对象,并添加命令到队列中
- Invoker invoker = new Invoker();
- invoker.addCommand(command1);
- invoker.addCommand(command2);
-
- // 执行所有命令
- invoker.executeCommands();
- }
-
-
- }
在上述代码中,我们定义了一个抽象的Command接口,其中包含了一个execute()方法。然后创建了两个具体的命令类:ConcreteCommand1和`ConcreteCommand2,它们实现了Command接口并重写了execute()`方法。这些具体的命令类将调用接收者类中的不同操作。
在接收者类中,我们定义了两个操作:action1()和action2()。
最后,我们创建了一个调用者类/发送者类/Invoker类。它维护一个命令队列,并提供添加命令和执行所有命令的方法。当调用执行所有命令的方法时,它会依次执行每个命令。
通过使用命令模式,可以将请求发送方与接收方解耦,并且可以轻松地添加新的具体命令而无需修改现有代码。此外,由于每个具体的命令都是独立封装的对象,因此可以轻松地进行参数化配置和传递。