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');
相关推荐
从小就看凹凸曼^o^2 分钟前
Python基础5 - 字典与集合:(1)字典
开发语言·python
侧耳倾听11116 分钟前
java 日志框架简介
java·开发语言
Java&Develop19 分钟前
QuantDinger 宝塔 Linux 部署完整指南
linux·运维·状态模式
zlinear数据采集卡42 分钟前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
全栈技术负责人1 小时前
解密 MCP(Model Context Protocol):大模型时代的“Type-C”总线与三驾马车架构深度解析
开发语言·ai·架构
大家的林语冰1 小时前
✌️ 让 Rust 再次伟大,pnpm 12 抛弃 TypeScript,移植 Rust 原地起飞!
前端·javascript·node.js
丰锋ff1 小时前
1.7在Qt窗口中添加右键菜单
开发语言·qt
Titan20241 小时前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++
鸿芯微控科技2 小时前
压电点胶阀出胶量不稳定怎么排查?驱动波形、背压、点胶重量与Python分析
开发语言·python·压电点胶阀·精密点胶·点胶重量·流体控制
原野池予2 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言