• 设计模式14、命令模式 Command


    解释说明:命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适对象,并把该命令传给相应的对象,该对象执行命令。

    命令抽象类(Command):定义命令的接口,声明执行的方法。

    具体命令(ConcreteCommand):命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。

    实现者/接收者(Receiver):接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。

    调用者/请求者(Invoker):要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

    1. command.h
    2. #pragma once
    3. class Command
    4. {
    5. public:
    6. //每个命令类都必须有一个执行命令的方法
    7. virtual void execute() = 0;
    8. };
    9. receiver.h
    10. #pragma once
    11. class Receiver
    12. {
    13. public:
    14. //抽象接收者, 定义每个接收者都必须完成的业务
    15. virtual ~Receiver() { }
    16. virtual void doSomething() = 0;
    17. };
    18. concreteCommand.h
    19. #pragma once
    20. #include "command.h"
    21. #include "receiver.h"
    22. #include
    23. class ConcreteCommand1 :public Command
    24. {
    25. private:
    26. Receiver* m_pReceiver;//哪个Receiver类进行命令处理
    27. public:
    28. //构造函数传递接收者
    29. ConcreteCommand1(Receiver* receiver)
    30. {
    31. m_pReceiver = receiver;
    32. }
    33. //必须实现一个命令
    34. void execute()
    35. {
    36. //业务处理
    37. std::cout << "command1 run" << std::endl;
    38. m_pReceiver->doSomething();
    39. }
    40. };
    41. class ConcreteCommand2 : public Command
    42. {
    43. private:
    44. Receiver* m_pReceiver;
    45. public:
    46. ConcreteCommand2(Receiver* receiver)
    47. {
    48. m_pReceiver = receiver;
    49. }
    50. void execute()
    51. {
    52. std::cout << "command2 run" << std::endl;
    53. m_pReceiver->doSomething();
    54. }
    55. };
    56. concreteReciver.h
    57. #pragma once
    58. #include "receiver.h"
    59. #include
    60. class ConcreteReciver1 : public Receiver
    61. {
    62. //每个接收者都必须处理一定的业务逻辑
    63. public:
    64. void doSomething()
    65. {
    66. std::cout << "Reciver1 doing" << std::endl;
    67. }
    68. };
    69. class ConcreteReciver2 : public Receiver
    70. {
    71. //每个接收者都必须处理一定的业务逻辑
    72. public:
    73. void doSomething()
    74. {
    75. std::cout << "Reciver2 doing" << std::endl;
    76. }
    77. };
    78. invoker.h
    79. #pragma once
    80. #include "command.h"
    81. #include
    82. class Invoker
    83. {
    84. private:
    85. Command* m_pCommand;
    86. public:
    87. //接受命令
    88. void setCommand(Command* command)
    89. {
    90. m_pCommand = command;
    91. std::cout << "invoker add command" << std::endl;
    92. }
    93. //执行命令
    94. void action()
    95. {
    96. m_pCommand->execute();
    97. std::cout << "invoker action command" << std::endl;
    98. }
    99. };
    100. main.cpp
    101. #include "concreteCommand.h"
    102. #include "concreteReciver.h"
    103. #include "invoker.h"
    104. int main()
    105. {
    106. //首先声明调用者Invoker
    107. Invoker* invoker = new Invoker();
    108. //定义接收者
    109. Receiver* receiver = new ConcreteReciver1();
    110. Receiver* receiver2 = new ConcreteReciver2();
    111. //定义一个发送给接收者的命令
    112. Command* command = new ConcreteCommand1(receiver);
    113. Command* command2 = new ConcreteCommand2(receiver);
    114. Command* command3 = new ConcreteCommand1(receiver2);
    115. Command* command4 = new ConcreteCommand2(receiver2);
    116. //把命令交给调用者去执行
    117. invoker->setCommand(command);
    118. invoker->action();
    119. invoker->setCommand(command2);
    120. invoker->action();
    121. invoker->setCommand(command3);
    122. invoker->action();
    123. invoker->setCommand(command4);
    124. invoker->action();
    125. system("pause");
    126. return 0;
    127. }

  • 相关阅读:
    如何解决基因行业海量数据传输难题?镭速传输给出答案
    Keil5中复制粘贴中文乱码解决
    文件上传接入阿里云OSS
    数据中台:数据中台技术架构详解
    java-php-python-基于Ssm学生信息管理系统计算机毕业设计
    MySQL索引事务
    Android 组件化
    线程——进程与线程——day10
    二叉树的深度
    AVL树和2-3-4树详解
  • 原文地址:https://blog.csdn.net/u013480226/article/details/133635475