使用J*aScript实现一个命令模式_js设计模式


命令模式通过将请求封装为对象,使程序支持可撤销操作和任务队列;其核心角色包括命令、具体命令、接收者和调用者;J*aScript中可用于遥控器示例,实现灯的开关与撤销功能,并广泛应用于菜单系统、操作历史、任务队列等场景。

使用javascript实现一个命令模式_js设计模式

命令模式是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。命令模式还能支持撤销操作。在J*aScript中,这种模式非常适合处理用户交互、任务队列和可撤销操作等场景。

基本结构

命令模式通常包含以下几个角色:

  • 命令(Command):定义执行操作的接口,通常是一个有execute方法的对象。
  • 具体命令(Concrete Command):实现命令接口,持有对接收者的引用,并在execute中调用接收者的方法。
  • 接收者(Receiver):真正执行操作的对象。
  • 调用者(Invoker):触发命令执行的对象,不直接与接收者交互。

简单实现示例

下面是一个使用J*aScript实现的命令模式例子,模拟一个简单的遥控器控制灯的开关。

// 接收者:灯
class Light {
  turnOn() {
    console.log("灯打开了");
  }
  
  turnOff() {
    console.log("灯关闭了");
  }
}

// 命令接口(抽象)
class Command {
  execute() {
    throw new Error("子类必须实现execute方法");
  }
}

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

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

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

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

// 调用者:遥控器
class RemoteControl {
  constructor() {
    this.command = null;
  }

  setCommand(command) {
    this.command = command;
  }

  pressButton() {
    if (this.command) {
      this.command.execute();
    }
  }
}

// 使用示例
const light = new Light();
const lightOn = new LightOnCommand(light);
const lightOff = new LightOffCommand(light);
const remote = new RemoteControl();

remote.setCommand(lightOn);
remote.pressButton(); // 输出:灯打开了

remote.setCommand(lightOff);
remote.pressButton(); // 输出:灯关闭了

支持撤销操作

命令模式的一个优势是容易实现撤销功能。我们可以在命令对象中添加undo方法。

现代化家居响应式网站模板1.0 现代化家居响应式网站模板1.0

现代化家居响应式网站模板源码是以cmseasy进行开发的家居网站模板。该软件可免费使用,模板附带测试数据!模板源码特点:整体采用浅色宽屏设计,简洁大气,电脑手机自适应布局,大方美观,功能齐全,值得推荐的一款模板,每个页面精心设计,美观大方,兼容各大浏览器;所有代码经过SEO优化,使网站更利于搜索引擎排名,是您做环保类网站的明确选择。无论是在电脑、平板、手机上都可以访问到排版合适的网站,即便是微信等

现代化家居响应式网站模板1.0 0 查看详情 现代化家居响应式网站模板1.0
// 修改具体命令,增加undo支持

class LightOnCommand extends Command {
  constructor(light) {
    super();
    this.light = light;
  }

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

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

class LightOffCommand extends Command {
  constructor(light) {
    super();
    this.light = light;
  }

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

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

// 扩展调用者以支持撤销
class RemoteControl {
  constructor() {
    this.command = null;
  }

  setCommand(command) {
    this.command = command;
  }

  pressButton() {
    if (this.command) {
      this.command.execute();
    }
  }

  pressUndo() {
    if (this.command && typeof this.command.undo === 'function') {
      this.command.undo();
    }
  }
}

// 演示撤销
remote.setCommand(lightOn);
remote.pressButton(); // 灯打开了
remote.pressUndo();   // 灯关闭了

实际应用场景

命令模式在前端开发中有多种用途:

  • 菜单或按钮系统:每个菜单项对应一个命令对象。
  • 操作历史与撤销重做:将每次操作保存为命令,便于回退。
  • 任务队列:将命令放入队列延迟执行或批量处理。
  • 远程调用或消息系统:将请求序列化为命令对象传输。

基本上就这些。通过封装请求为对象,命令模式让程序更灵活、可扩展,也更容易维护复杂的行为逻辑。

以上就是使用J*aScript实现一个命令模式_js设计模式的详细内容,更多请关注其它相关文章!


# 文件上传  # 漯河专业的网站建设价格  # 凤岗口碑营销推广  # 云南网站建设建站系统  # 宿迁网站建设宣传语  # 抖音seo代理推荐  # 如何优化网站技术  # 罗湖大型网站推广公司  # 网站推广和seo  # 辽阳网站建设有哪些企业  # 南平seo哪家好  # 几个  # 特殊字符  # javascript  # 关闭了  # 计算方法  # 如何实现  # 中特  # 打开了  # 调用者  # 是一个  # 前端开发  # 前端  # js  # java 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: mail.qq.com登录入口 QQ邮箱网页版直达  《盗墓笔记手游》技能介绍  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  139邮箱登录入口官网 139邮箱登录入口官网网址  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  获取WooCommerce产品在后台编辑页面的分类ID  QQ阅读小说搜索入口地址_QQ阅读小说搜索入口地址搜索在线阅读  如何查询个人病历记录  《随手记》备份数据方法  《下一站江湖2》大雪山加入方法  偃武诸葛亮阵容搭配推荐  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  《海豚家》注销账号方法  J*aScript装饰器_元编程实战  泰拉瑞亚水晶无法放置问题  win11怎么设置默认终端为Windows Terminal Win11替代CMD和PowerShell【技巧】  知音漫客官网首页入口_知音漫客热门漫画推荐  虫虫漫画绿色安全入口_虫虫漫画绿色安全入口安全看漫画  歌词怎么展示在|直播|间视频号?有什么注意事项?  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  汽车之家网页版免费登录_汽车之家官网首页直接进入  《环球网校》设置报考省市方法  qq邮箱怎么注册_QQ邮箱注册步骤与注意事项  抖音赚钱快速入门_新手必看的抖音赚钱步骤  猫眼电影app如何参与官方的抽奖活动_猫眼电影官方抽奖参与方法  第五人格PC版怎么避免被封号_第五人格PC版防封号注意事项  QQ邮箱手机版网页版 QQ邮箱登录入口地址  Lar*el Socialite单设备登录策略:实现用户唯一会话管理  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  byrutor直接访问入口 byrutor官方游戏库  mysql中如何分析索引使用情况_mysql索引使用分析方法  口腔诊所管理软件推荐  家里的小飞虫总是不断,用什么方法可以彻底根除?  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  windows10怎么更改下载路径_windows10默认存储位置修改教程  悟空浏览器如何恢复关闭的标签页 悟空浏览器撤销关闭网页快捷键设置  京东快递包裹信息查询入口 京东快递官方查询平台入口  《随手记》关闭首页消息推送方法  《全民k歌》网页版最新登录入口一览  解决VS Code中Python版本冲突与输出异常的指南  我的世界官方网址入口 我的世界游戏主页直达入口  之了课堂app做题入口  J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  如何在CSS中使用absolute实现登录弹窗居中_transform translate结合  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  谷歌浏览器官方镜像获取方法_谷歌浏览器网页版入口极速直达 

 2025-11-02

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.