当前位置: 首页 > article >正文

js状态模式

允许一个对象在其内部状态改变时改变它的行为。
状态模式将对象的状态封装成独立的类,并使它们可以互相转换
在这里插入图片描述

 // 定义状态接口

class State {

  constructor() {

    if (this.constructor === State) {

      throw new Error('不能实例化抽象类');

    }

  }

  // 定义状态方法

  handle(context) {

    throw new Error('必须实现 handle 方法');

  }

}

  

// 具体状态类 A

class ConcreteStateA extends State {

  constructor() {

    super();

  }

  // 实现状态方法

  handle(context) {

    console.log('执行具体状态 A 的方法');

    context.setState(new ConcreteStateB());

  }

}

  

// 具体状态类 B

class ConcreteStateB extends State {

  constructor() {

    super();

  }

  // 实现状态方法

  handle(context) {

    console.log('执行具体状态 B 的方法');

    context.setState(new ConcreteStateA());

  }

}

  

// 上下文类

class Context {

  constructor() {

    this.state = new ConcreteStateA();

  }

  // 设置状态方法

  setState(state) {

    this.state = state;

  }

  // 执行状态方法

  request() {

    this.state.handle(this);

  }

}

  

// 使用状态模式

let context = new Context();

context.request();

context.request();

context.request();
class CoffeeMaker {

    constructor() {

      /**

      这里略去咖啡机中与咖啡状态切换无关的一些初始化逻辑

    **/

      // 初始化状态,没有切换任何咖啡模式

      this.state = 'init';

      // 初始化牛奶的存储量

      this.leftMilk = '500ml';

    }

    //将状态作为属性放进去

    stateToProcessor = {

      that: this,

      american() {

        // 尝试在行为函数里拿到咖啡机实例的信息并输出

        console.log('咖啡机现在的牛奶存储量是:', this.that.leftMilk)

        console.log('我只吐黑咖啡');

      },

      latte() {

        this.american()

        console.log('加点奶');

      },

      vanillaLatte() {

        this.latte();

        console.log('再加香草糖浆');

      },

      mocha() {

        this.latte();

        console.log('再加巧克力');

      }

    }

    // 关注咖啡机状态切换函数

    changeState(state) {

      this.state = state;

      if (!this.stateToProcessor[state]) {

        return;

      }

      this.stateToProcessor[state]();

    }

  }

  const mk = new CoffeeMaker();

  mk.changeState('latte');

http://www.kler.cn/a/501692.html

相关文章:

  • type 属性的用途和实现方式(图标,表单,数据可视化,自定义组件)
  • MySQL(高级特性篇) 04 章——逻辑架构
  • 滚动字幕视频怎么制作
  • 理解AJAX与Axios:异步编程的世界
  • ctypes对接C/C++函数中char*输出型参数
  • 不同音频振幅dBFS计算方法
  • 浅谈云计算05 | 云存储等级及其接口工作原理
  • Linux系列---【如何配置环境变量?】
  • Oracle OCP考试常见问题之线上考试流程
  • LeetCode 1639. Number of Ways to Form a Target String Given a Dictionary
  • Python贪心
  • Unity 大地图功能 离线瓦片地图
  • python-leetcode-三数之和
  • h5使用better scroll实现左右列表联动
  • c++ haru生成pdf输出文本实例
  • Java 如何传参xml调用接口获取数据
  • 后端开发 Springboot整合Redis Spring Data Redis 模板
  • 【大数据】数据科学导论---数据科学的概念
  • 状态模式详解与应用
  • 人工智能之基于阿里云快速搭建语音合成
  • Seata的部署与微服务集成
  • pytorch张量的new_zeros方法介绍
  • python-leetcode-有效的数独
  • Java 将RTF文档转换为Word、PDF、HTML、图片
  • uniapp使用scss mixin抽离css常用的公共样式
  • PyTorch reshape函数介绍