如何深入理解JavaScript中的命令模式与状态模式及其应用场景?

2026-04-01 14:242阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1044个文字,预计阅读时间需要5分钟。

如何深入理解JavaScript中的命令模式与状态模式及其应用场景?

目录+命令模式介绍+代码实现+状态模式介绍+代码实现+小结+命令模式+命令模式介绍+命令模式(Command)的定义是:用于将一个请求封装为一个对象,从而让你使用不同的请求、队列或日志来参数化其他对象。让你可以灵活地组合请求、延迟请求执行或添加请求撤销功能。

目录
  • 命令模式
    • 命令模式介绍
    • 代码实现
  • 状态模式
    • 状态模式介绍
    • 代码实现
  • 小结

    命令模式

    命令模式介绍

    命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及执行可撤销的操作。

    也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。

    如何深入理解JavaScript中的命令模式与状态模式及其应用场景?

    代码实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>cmd-demo</title> </head> <body> <div> <button id="btn1">按钮1</button> <button id="btn2">按钮2</button> </div> <script> var btn1 = document.getElementById('btn1') var btn2 = document.getElementById('btn2') // 定义一个命令发布者(执行者)的类 class Executor { setCommand(btn, command) { btn.onclick = function() { command.execute() } } } // 定义一个命令接收者 class Menu { refresh() { console.log('刷新菜单') } addSubMenu() { console.log('增加子菜单') } } // 定义一个刷新菜单的命令对象的类 class RefreshMenu { constructor(receiver) { // 命令对象与接收者关联 this.receiver = receiver } // 暴露出统一的接口给命令发布者Executor execute() { this.receiver.refresh() } } // 定义一个增加子菜单的命令对象的类 class AddSubMenu { constructor(receiver) { // 命令对象与接收者关联 this.receiver = receiver } // 暴露出统一的接口给命令发布者Executor execute() { this.receiver.addSubMenu() } } var menu = new Menu() var executor = new Executor() var refreshMenu = new RefreshMenu(menu) // 给按钮1添加刷新功能 executor.setCommand(btn1, refreshMenu) var addSubMenu = new AddSubMenu(menu) // 给按钮2添加增加子菜单功能 executor.setCommand(btn2, addSubMenu) </script> </body> </html>

    状态模式

    状态模式介绍

    状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>state-demo</title> </head> <body> <button id="btn">开关</button> <script> // 定义一个关闭状态的类 class OffLightState { constructor(light) { this.light = light } // 每个类都需要这个方法,在不同状态下按都需要触发这个方法 pressBtn() { this.light.setState(this.light.weekLightState) console.log('开启弱光') } } // 定义一个弱光状态的类 class WeekLightState { constructor(light) { this.light = light } pressBtn() { this.light.setState(this.light.strongLightState) console.log('开启强光') } } // 定义一个强光状态的类 class StrongLightState { constructor(light) { this.light = light } pressBtn() { this.light.setState(this.light.offLightState) console.log('关闭电灯') } } class Light { constructor() { this.offLightState = new OffLightState(this) this.weekLightState = new WeekLightState(this) this.strongLightState = new StrongLightState(this) this.currentState = null } setState(newState) { this.currentState = newState } init() { this.currentState = this.offLightState } } let light = new Light() light.init() var btn = document.getElementById('btn') btn.onclick = function() { light.currentState.pressBtn() } </script> </body> </html>

    小结

    • 通过定义不同的状态类,根据状态的改变而改变对象的行为,
    • 不必把大量的逻辑都写在被操作对象的类中,而且容易增加新的状态
    • 符合开放封闭原则

    以上就是JavaScript设计模式之命令模式和状态模式详解的详细内容,更多关于JavaScript 命令模式状态模式的资料请关注易盾网络其它相关文章!

    本文共计1044个文字,预计阅读时间需要5分钟。

    如何深入理解JavaScript中的命令模式与状态模式及其应用场景?

    目录+命令模式介绍+代码实现+状态模式介绍+代码实现+小结+命令模式+命令模式介绍+命令模式(Command)的定义是:用于将一个请求封装为一个对象,从而让你使用不同的请求、队列或日志来参数化其他对象。让你可以灵活地组合请求、延迟请求执行或添加请求撤销功能。

    目录
    • 命令模式
      • 命令模式介绍
      • 代码实现
    • 状态模式
      • 状态模式介绍
      • 代码实现
    • 小结

      命令模式

      命令模式介绍

      命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及执行可撤销的操作。

      也就是说改模式旨在将函数的调用、请求和操作封装成一个单一的对象,然后对这个对象进行一系列的处理。此外,可以通过调用实现具体函数的对象来解耦命令对象与接收对象。

      如何深入理解JavaScript中的命令模式与状态模式及其应用场景?

      代码实现

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>cmd-demo</title> </head> <body> <div> <button id="btn1">按钮1</button> <button id="btn2">按钮2</button> </div> <script> var btn1 = document.getElementById('btn1') var btn2 = document.getElementById('btn2') // 定义一个命令发布者(执行者)的类 class Executor { setCommand(btn, command) { btn.onclick = function() { command.execute() } } } // 定义一个命令接收者 class Menu { refresh() { console.log('刷新菜单') } addSubMenu() { console.log('增加子菜单') } } // 定义一个刷新菜单的命令对象的类 class RefreshMenu { constructor(receiver) { // 命令对象与接收者关联 this.receiver = receiver } // 暴露出统一的接口给命令发布者Executor execute() { this.receiver.refresh() } } // 定义一个增加子菜单的命令对象的类 class AddSubMenu { constructor(receiver) { // 命令对象与接收者关联 this.receiver = receiver } // 暴露出统一的接口给命令发布者Executor execute() { this.receiver.addSubMenu() } } var menu = new Menu() var executor = new Executor() var refreshMenu = new RefreshMenu(menu) // 给按钮1添加刷新功能 executor.setCommand(btn1, refreshMenu) var addSubMenu = new AddSubMenu(menu) // 给按钮2添加增加子菜单功能 executor.setCommand(btn2, addSubMenu) </script> </body> </html>

      状态模式

      状态模式介绍

      状态模式(State)允许一个对象在其内部状态改变的时候改变它的行为,对象看起来似乎修改了它的类。

      <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>state-demo</title> </head> <body> <button id="btn">开关</button> <script> // 定义一个关闭状态的类 class OffLightState { constructor(light) { this.light = light } // 每个类都需要这个方法,在不同状态下按都需要触发这个方法 pressBtn() { this.light.setState(this.light.weekLightState) console.log('开启弱光') } } // 定义一个弱光状态的类 class WeekLightState { constructor(light) { this.light = light } pressBtn() { this.light.setState(this.light.strongLightState) console.log('开启强光') } } // 定义一个强光状态的类 class StrongLightState { constructor(light) { this.light = light } pressBtn() { this.light.setState(this.light.offLightState) console.log('关闭电灯') } } class Light { constructor() { this.offLightState = new OffLightState(this) this.weekLightState = new WeekLightState(this) this.strongLightState = new StrongLightState(this) this.currentState = null } setState(newState) { this.currentState = newState } init() { this.currentState = this.offLightState } } let light = new Light() light.init() var btn = document.getElementById('btn') btn.onclick = function() { light.currentState.pressBtn() } </script> </body> </html>

      小结

      • 通过定义不同的状态类,根据状态的改变而改变对象的行为,
      • 不必把大量的逻辑都写在被操作对象的类中,而且容易增加新的状态
      • 符合开放封闭原则

      以上就是JavaScript设计模式之命令模式和状态模式详解的详细内容,更多关于JavaScript 命令模式状态模式的资料请关注易盾网络其它相关文章!