js状态模式

允许一个对象在其内部状态改变时改变它的行为。

状态模式将对象的状态封装成独立的类,并使它们可以互相转换

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();
js 复制代码
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');
相关推荐
没头脑和不高兴y4 分钟前
Element-Plus-X:基于Vue 3的AI交互组件库
前端·javascript
ErMao6 分钟前
Proxy 与 Reflect:最硬核、最实用的解释
前端·javascript
算法如诗6 分钟前
**MATLAB R2025a** 环境下,基于 **双向时间卷积网络(BITCN)+ 双向长短期记忆网络(BiLSTM)** 的多特征分类预测完整实现
开发语言·网络·matlab
k09338 分钟前
在组件外(.js文件)中使用pinia的方法2--在http.js中使用pinia
开发语言·javascript·http
Glommer21 分钟前
AST 反混淆处理示例
javascript·爬虫
二川bro23 分钟前
第44节:物理引擎进阶:Bullet.js集成与高级物理模拟
开发语言·javascript·ecmascript
中文Python25 分钟前
小白中文Python-双色球LSTM模型出号程序
开发语言·人工智能·python·lstm·中文python·小白学python
越努力越幸运50827 分钟前
JavaScript进阶篇垃圾回收、闭包、函数提升、剩余参数、展开运算符、对象解构
开发语言·javascript
czhc114007566327 分钟前
C# 1116 流程控制 常量
开发语言·c#
程序员ys43 分钟前
Vue的响应式系统是怎么实现的
前端·javascript·vue.js