经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
每天一个设计模式之命令模式
来源:cnblogs  作者:GodBMW  时间:2018/12/14 9:30:10  对本文有异议

作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascriptpython两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :)

原文地址是:《每天一个设计模式之命令模式》

欢迎关注个人技术博客:godbmw.com。每周 1 篇原创技术分享!开源教程(webpack、设计模式)、面试刷题(偏前端)、知识整理(每周零碎),欢迎长期关注!

如果您也想进行知识整理 + 搭建功能完善/设计简约/快速启动的个人博客,请直接戳theme-bmw

0. 示例代码

1. 什么是“命令模式”?

命令模式是一种数据驱动的设计模式,它属于行为型模式。

  1. 请求以命令的形式包裹在对象中,并传给调用对象。
  2. 调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象。
  3. 该对象执行命令。

在这三步骤中,分别有 3 个不同的主体:发送者、传递者和执行者。在实现过程中,需要特别关注。

2. 应用场景

有时候需要向某些对象发送请求,但是又不知道请求的接受者是谁,更不知道被请求的操作是什么。此时,命令模式就是以一种松耦合的方式来设计程序

3. 代码实现

3.1 python3 实现

命令对象将动作的接收者设置在属性中,并且对外暴露了execute接口(按照习惯约定)。

在其他类设置命令并且执行命令的时候,只需要按照约定调用Command对象的execute()即可。到底是谁接受命令,并且怎么执行命令,都交给Command对象来处理!

  1. __author__ = 'godbmw.com'
  2. # 接受到命令,执行具体操作
  3. class Receiver(object):
  4. def action(self):
  5. print("按钮按下,执行操作")
  6. # 命令对象
  7. class Command:
  8. def __init__(self, receiver):
  9. self.receiver = receiver
  10. def execute(self):
  11. self.receiver.action()
  12. # 具体业务类
  13. class Button:
  14. def __init__(self):
  15. self.command = None
  16. # 设置命令对戏那个
  17. def set_command(self, command):
  18. self.command = command
  19. # 按下按钮,交给命令对象调用相关函数
  20. def down(self):
  21. if not self.command:
  22. return
  23. self.command.execute()
  24. if __name__ == "__main__":
  25. receiver = Receiver()
  26. command = Command(receiver)
  27. button = Button()
  28. button.set_command(command)
  29. button.down()

3.2 ES6 实现

setCommand方法为按钮指定了命令对象,命令对象为调用者(按钮)找到了接收者(MenuBar),并且执行了相关操作。而按钮本身并不需要关心接收者和接受操作

  1. // 接受到命令,执行相关操作
  2. const MenuBar = {
  3. refresh() {
  4. console.log("刷新菜单页面");
  5. }
  6. };
  7. // 命令对象,execute方法就是执行相关命令
  8. const RefreshMenuBarCommand = receiver => {
  9. return {
  10. execute() {
  11. receiver.refresh();
  12. }
  13. };
  14. };
  15. // 为按钮对象指定对应的 对象
  16. const setCommand = (button, command) => {
  17. button.onclick = () => {
  18. command.execute();
  19. };
  20. };
  21. let refreshMenuBarCommand = RefreshMenuBarCommand(MenuBar);
  22. let button = document.querySelector("button");
  23. setCommand(button, refreshMenuBarCommand);

下面是同级目录的 html 代码,在谷歌浏览器中打开创建的index.html,并且打开控制台,即可看到效果。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  7. <title>命令模式</title>
  8. </head>
  9. <body>
  10. <button>按钮</button>
  11. <script src="./main.js"></script>
  12. </body>
  13. </html>

4. 参考

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号