• 命令模式简介


    概念

    命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许您将不同的请求参数化、队列化,并且能够在不同的时间点执行。通过引入命令对象(Command)来解耦发送者(Invoker)和接收者(Receiver),使得发送者无需知道具体的接收者或操作细节。命令对象封装了一系列操作,并提供了一个统一的方法(如execute()),以便调用这些操作。

    特点

    1. 解耦性:命令模式将发送者与接收者之间解耦,使得它们可以独立演化。
    2. 可扩展性:可以方便地添加新的命令类和接收类,而无需修改现有代码。
    3. 可撤销/重做:由于每个命令都包含了执行和撤销操作,因此可以轻松地实现撤销、重做等功能。
    4. 容易组合:多个简单命令可以组合成复杂命令,在需要时进行灵活组合。

    优点

    1. 降低系统的耦合度。发送者与接收者之间不存在直接关联关系。
    2. 更好地支持撤销、重做等功能。每个具体命令断言了相关操作及其撤销操作。
    3. 更好地支持日志和事务。可以记录命令的执行过程,以及在需要时进行回滚。

    缺点

    1. 可能会导致类爆炸。每个具体命令都需要一个对应的接收者类。
    2. 命令模式增加了系统的复杂性,因为它引入了额外的抽象层次。

    适用场景

    1. 需要将请求参数化、队列滑,并希望能够在不同时间执行。
    2. 需要支持撤销、重做等功能。
    3. 需要实现日志记录、事务管理等功能。

    实现方式

    1. 定义一个抽象命令(Command)接口或抽象类,其中包含一个execute()方法用于执行命令。
    2. 创建具体命令类,实现抽象命令接口或继承抽象命令类,并在其中编写具体操作逻辑及其撤销逻辑。
    3. 定义接收者(Receiver)类,该类包含真正执行操作的方法。
    4. 创建调用者(Invoker)对象,在其中维护一系列命令对象,并通过调用execute()方法来触发相应的操作。

    实现代码

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. // 抽象命令接口
    4. interface Command {
    5. void execute();
    6. }
    7. // 具体命令类1
    8. class ConcreteCommand1 implements Command {
    9. private Receiver receiver;
    10. public ConcreteCommand1(Receiver receiver) {
    11. this.receiver = receiver;
    12. }
    13. @Override
    14. public void execute() {
    15. receiver.action1();
    16. }
    17. }
    18. // 具体命令类2
    19. class ConcreteCommand2 implements Command {
    20. private Receiver receiver;
    21. public ConcreteCommand2(Receiver receiver) {
    22. this.receiver = receiver;
    23. }
    24. @Override
    25. public void execute() {
    26. receiver.action2();
    27. }
    28. }
    29. // 接收者类
    30. class Receiver {
    31. public void action1() {
    32. System.out.println("执行操作1");
    33. }
    34. public void action2() {
    35. System.out.println("执行操作2");
    36. }
    37. }
    38. // 调用者类/发送者类/Invoker类
    39. class Invoker {
    40. private List commands = new ArrayList<>();
    41. // 添加命令到队列中
    42. public void addCommand(Command command) {
    43. commands.add(command);
    44. }
    45. // 执行所有的命令
    46. public void executeCommands() {
    47. for (Command command : commands) {
    48. command.execute();
    49. }
    50. commands.clear(); // 清空已执行的命令列表,可选操作。
    51. }
    52. }
    53. public class Main {
    54. public static void main(String[] args) {
    55. // 创建接收者对象
    56. Receiver receiver = new Receiver();
    57. // 创建具体命令对象并指定接收者
    58. Command command1 = new ConcreteCommand1(receiver);
    59. Command command2 = new ConcreteCommand2(receiver);
    60. // 创建调用者对象,并添加命令到队列中
    61. Invoker invoker = new Invoker();
    62. invoker.addCommand(command1);
    63. invoker.addCommand(command2);
    64. // 执行所有命令
    65. invoker.executeCommands();
    66. }
    67. }

    在上述代码中,我们定义了一个抽象的Command接口,其中包含了一个execute()方法。然后创建了两个具体的命令类:ConcreteCommand1`ConcreteCommand2,它们实现了Command接口并重写了execute()`方法。这些具体的命令类将调用接收者类中的不同操作。

    在接收者类中,我们定义了两个操作:action1()action2()

    最后,我们创建了一个调用者类/发送者类/Invoker类。它维护一个命令队列,并提供添加命令和执行所有命令的方法。当调用执行所有命令的方法时,它会依次执行每个命令。

    通过使用命令模式,可以将请求发送方与接收方解耦,并且可以轻松地添加新的具体命令而无需修改现有代码。此外,由于每个具体的命令都是独立封装的对象,因此可以轻松地进行参数化配置和传递。

  • 相关阅读:
    常用Python自动化测试框架有哪些?优缺点对比
    jQurey-基本知识点总结
    python合集1
    mysql中的函数
    JS排序算法
    数据结构与算法训练:第十六弹
    [Python]Django 模型
    【Android】深入Binder拦截
    数据结构和算法(11):红黑树
    【STM32】时钟设置函数(寄存器版)
  • 原文地址:https://blog.csdn.net/aidscooler/article/details/133012517