掌握设计模式:深入了解命令模式的优雅调度与行为解耦

这篇具有很好参考价值的文章主要介绍了掌握设计模式:深入了解命令模式的优雅调度与行为解耦。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

命令模式是一种行为设计模式,其目的是将请求发送者和接收者解耦,从而允许发送者发送请求,而无需知道请求的具体处理方式。在命令模式中,请求被封装为一个对象,这个对象包含了执行请求所需的所有信息,包括调用方法、参数等。这样,请求的发送者只需知道如何发送命令对象,而不需要关心命令的具体执行。

关键角色和概念:

命令接口(Command): 声明了执行命令的方法 execute(),以及可能的撤销方法 undo() 和重做方法 redo()。这个接口可以有多个具体实现类,每个类代表不同的命令。
具体命令(ConcreteCommand): 实现了命令接口,负责执行具体的操作。它通常包含一个接收者对象,通过调用接收者的方法来完成实际的工作。
调用者(Invoker): 请求的发送者,负责将命令发送给接收者。它并不知道命令的具体执行细节,只是负责发送请求。
接收者(Receiver): 实际执行命令操作的对象。命令对象通常会包含一个接收者,通过调用接收者的方法来完成命令的执行。
客户端(Client): 创建命令对象、接收者对象以及调用者对象的地方。客户端将命令对象与调用者关联,并发送请求。

命令模式的优点包括:

解耦请求发送者和接收者: 命令模式将请求的发送者和接收者解耦,使得它们不需要直接了解对方。这提高了系统的灵活性和可维护性。

支持撤销和重做: 通过在命令对象中添加 undo() 和 redo() 方法,可以轻松实现撤销和重做操作。

容易扩展: 可以轻松添加新的命令类,无需修改现有的代码。

命令模式通常在需要对请求进行参数化、排队、记录日志、支持撤销和重做等场景中发挥作用。

简易命令模式示例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Command Pattern Demo</title>
  </head>
  <body>
    <!-- 页面标题 -->
    <h1>Command Pattern Demo</h1>

    <!-- 按钮触发灯的开关命令 -->
    <button onclick="pressLightButton()">Toggle Light</button>
    <!-- 按钮触发风扇的开关命令 -->
    <button onclick="pressFanButton()">Toggle Fan</button>
    <!-- 按钮触发撤销操作 -->
    <button onclick="undo()">Undo</button>
    <!-- 按钮触发重做操作 -->
    <button onclick="redo()">Redo</button>

    <!-- 图片显示灯和风扇状态 -->
    <div>
      <img
        id="light"
        src="./light.png"
        height="90"
        style="filter: grayscale(100%)"
      />
      <img
        id="fan"
        src="./fan.png"
        height="90"
        style="filter: grayscale(100%)"
      />
    </div>

    <!-- 显示命令执行信息的区域 -->
    <div id="output"></div>

    <script>
      // 命令接口
      class Command {
        execute() {}
        undo() {}
        redo() {}
      }

      // 具体命令 - 打开灯
      class LightOnCommand extends Command {
        constructor(light) {
          super();
          this.light = light;
        }

        execute() {
          this.light.turnOn();
          addCommandToHistory(this);
        }

        undo() {
          this.light.turnOff();
        }

        redo() {
          this.light.turnOn();
        }
      }

      // 具体命令 - 关闭灯
      class LightOffCommand extends Command {
        constructor(light) {
          super();
          this.light = light;
        }

        execute() {
          this.light.turnOff();
          addCommandToHistory(this);
        }

        undo() {
          this.light.turnOn();
        }

        redo() {
          this.light.turnOff();
        }
      }

      // 具体命令 - 打开风扇
      class FanOnCommand extends Command {
        constructor(fan) {
          super();
          this.fan = fan;
        }

        execute() {
          this.fan.turnOn();
          addCommandToHistory(this);
        }

        undo() {
          this.fan.turnOff();
        }

        redo() {
          this.fan.turnOn();
        }
      }

      // 具体命令 - 关闭风扇
      class FanOffCommand extends Command {
        constructor(fan) {
          super();
          this.fan = fan;
        }

        execute() {
          this.fan.turnOff();
          addCommandToHistory(this);
        }

        undo() {
          this.fan.turnOn();
        }

        redo() {
          this.fan.turnOff();
        }
      }

      // 接收者 - 灯
      class Light {
        constructor() {
          this.isOn = false;
        }

        turnOn() {
          this.isOn = true;
          // 获取灯的 DOM 元素并设置为彩色(非灰度)
          const dom = document.getElementById("light");
          dom.style.filter = "grayscale(0%)";
          // 更新信息
          updateOutput("灯被打开了");
        }

        turnOff() {
          this.isOn = false;
          // 获取灯的 DOM 元素并设置为灰度
          const dom = document.getElementById("light");
          dom.style.filter = "grayscale(100%)";
          // 更新信息
          updateOutput("灯被关闭了");
        }
      }

      // 接收者 - 风扇
      class Fan {
        constructor() {
          this.isOn = false;
        }

        turnOn() {
          this.isOn = true;
          // 获取风扇的 DOM 元素并设置为彩色(非灰度)
          const dom = document.getElementById("fan");
          dom.style.filter = "grayscale(0%)";
          // 更新信息
          updateOutput("风扇被打开了");
        }

        turnOff() {
          this.isOn = false;
          // 获取风扇的 DOM 元素并设置为灰度
          const dom = document.getElementById("fan");
          dom.style.filter = "grayscale(100%)";
          // 更新信息
          updateOutput("风扇被关闭了");
        }
      }

      // 创建灯和风扇的实例
      const light = new Light();
      const fan = new Fan();

      // 创建具体命令实例
      const lightOnCommand = new LightOnCommand(light);
      const lightOffCommand = new LightOffCommand(light);
      const fanOnCommand = new FanOnCommand(fan);
      const fanOffCommand = new FanOffCommand(fan);

      // 命令历史记录和索引
      let commandHistory = [];
      let historyIndex = -1;

      // 将命令添加到历史记录
      function addCommandToHistory(command) {
        if (commandHistory.length >= 100) commandHistory.shift();
        commandHistory.push(command);
        historyIndex = commandHistory.length - 1;
      }

      // 撤销操作
      function undo() {
        if (historyIndex >= 0) {
          // 执行当前索引对应的命令的撤销操作
          commandHistory[historyIndex].undo();
          historyIndex--;
        }
      }

      // 重做操作
      function redo() {
        if (historyIndex < commandHistory.length - 1) {
          // 增加历史索引并执行对应命令的操作
          historyIndex++;
          commandHistory[historyIndex].redo();
        }
      }

      // 按钮点击触发灯的开关命令
      function pressLightButton() {
        if (light.isOn) {
          lightOffCommand.execute();
        } else {
          lightOnCommand.execute();
        }
      }

      // 按钮点击触发风扇的开关命令
      function pressFanButton() {
        if (fan.isOn) {
          fanOffCommand.execute();
        } else {
          fanOnCommand.execute();
        }
      }

      // 更新页面上显示命令执行信息的区域
      function updateOutput(message) {
        const outputDiv = document.getElementById("output");
        outputDiv.innerHTML = `<p>${message}</p>`;
      }
    </script>
  </body>
</html>

运行演示:

掌握设计模式:深入了解命令模式的优雅调度与行为解耦,设计模式,命令模式文章来源地址https://www.toymoban.com/news/detail-822803.html

到了这里,关于掌握设计模式:深入了解命令模式的优雅调度与行为解耦的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之开闭原则:如何优雅地扩展软件系统

    在现代软件开发中,设计模式是解决常见问题的最佳实践。其中,开闭原则作为面向对象设计的六大基本原则之一,为软件系统的可维护性和扩展性提供了强大的支持。本文将深入探讨开闭原则的核心理念,以及如何在实际项目中运用这一原则,以便更好地设计软件系统。

    2024年01月18日
    浏览(39)
  • 一文掌握设计模式(定义+UML类图+应用)

    从学编程一开始就被告知,要想做一名优秀的程序员两大必要技能: 1.源码阅读(JDK、C等底层语言封装) 2.设计模式(使用某种语言优雅的落地典型场景功能)。 一般随着工作年限的增长,被迫对底层语言/框架源码阅读的越来愈多,但是设计模式如不刻意去学习,永远不会真正掌

    2024年02月11日
    浏览(58)
  • 【chatgpt】让gpt带你掌握设计模式

    让gpt带你掌握设计模式 准备设计模式面试的 概述 什么是设计模式? 为什么设计模式重要? 设计模式的分类 创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂模式 (Factory Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结

    2024年02月05日
    浏览(36)
  • AI问答:前端需要掌握的设计模式/vue项目使用了哪些设计模式/vue项目开发可以使用哪些设计模式

    一、理解什么是设计模式 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。 设计模式是一个在软件设计领域中被广泛应用的概念,它指的是一套被公认为有效的解决特定问题的设计思路和方法。 设计模式更多的是指导思想和方法论,而不是现成的代码

    2024年02月09日
    浏览(64)
  • 【深入理解设计模式】 工厂设计模式

    工厂设计模式是一种 创建型设计模式 ,它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中,我们定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目的是: 封装对象创建的过程,使得

    2024年02月22日
    浏览(45)
  • 【了解一下常见的设计模式】

    **设计模式(Design Pattern)**是软件开发过程中一般问题的解决方案,是无数面向对象软件开发人员的经验总结,对于软件设计开发十分重要。然而由于设计模式种类繁多,内容偏理论,缺乏开发经验对于相关概念的理解也比较困难,同时其中不乏很多类型相似的设计模式,更

    2024年02月12日
    浏览(34)
  • 深入理解设计模式:设计模式定义、设计原则以及组织编目

    软件领域的设计模式起源主要是受到1977年建筑大师Alexander出版的《A Pattern Language:Towns, Building, Construction》一书。Alexander在其著作中将其建筑行业中的许多问题的最佳解决方案记录为200多种模式,其思想不仅在建筑行业影响深远,而且很快影响到了软件设计领域。 1987年,K

    2024年02月14日
    浏览(44)
  • 【深入浅出设计模式--状态模式】

    状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧密相关,如下所示: 在实际设计编码UI界面的工作中,有很多人应该都遇到过类似这样的场景:当鼠标移动或者点击某个标签

    2024年02月10日
    浏览(40)
  • 探索设计模式的魅力:“感受单例模式的力量与神秘” - 掌握编程的王牌技巧

          在软件开发的赛场上,单例模式以其独特的魅力长期占据着重要的地位。作为设计模式中的一员,它在整个软件工程的棋盘上扮演着关键性角色。本文将带你深入探索单例模式的神秘面纱,从历史渊源到现代应用,从基础实现到高级技巧,经过戏剧性的转折和层层推进

    2024年01月20日
    浏览(53)
  • 深入浅出设计模式 - 装饰者模式

    博主介绍 : ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌ Java知识图谱点击链接: 体系化学习Java(Java面试专题) 💕💕 感兴趣的同学可以收藏关注下 , 不然下次找不到哟 💕💕 装饰者模式(Decorator Pattern)是一种结构型设计模式,它

    2024年02月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包