javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS状态模式使用

JS设计模式之状态模式的用法使用方法

作者:慕仲卿

JavaScript状态模式是一种行为型设计模式,核心是对象在其内部状态改变时改变其行为,状态模式将对象的行为封装到不同的状态类中,使得对象在不同状态下可以选择不同的行为,本文给大家详细的介绍一下状态设计模式在Js中的使用,需要的朋友可以参考下

状态模式(State Pattern)

一种行为型设计模式,核心是对象在其内部状态改变时改变其行为

状态模式将对象的行为封装到不同的状态类中,使得对象在不同状态下可以选择不同的行为。

组成

工作流程

趣例

下面的这个例子展示了一位西安老铁观看国足比赛的时候的心理状态变化过程:

abstract class State {
  constructor(public context: Context | null = null) {}
  // 这里体现出③:用于封装与环境类的特定状态相关的行为
  handle() {
    if (!this.context) {
      console.log("找不到老铁了!");
    } else {
      this.exec();
    }
  }
  next<T extends State>(NextState: new (context: Context) => T) {
    if (!this.context) {
      console.log("找不到老铁了!");
    } else {
      this.context.to(new NextState(this.context));
    }
  }
  abstract exec(): any;
}
// 具体状态类
class StateA extends State {
  // 这里体现出④:用于封装与环境类的特定状态相关的行为
  exec() {
    console.log("买票");
    this.next(StateB);
  }
}
class StateB extends State {
  exec() {
    console.log("坐车");
    this.next(StateC);
  }
}
class StateC extends State {
  exec() {
    console.log("看球");
    this.next(StateO);
  }
}
class StateO extends State {
  exec() {
    throw new Error('已经结束了');
  }
}
// 环境类
class Context {
  // 这里体现出①:环境类维护一个对抽象状态类的引用,即cts
  constructor(public cts: State | null = null) {}
  to(state: State) {
    console.log(`Transitioning to ${state.constructor.name}`);
    this.cts = state;
  }
  do() {
    // 这里体现出②:通过该引用来调用具体状态类的方法
    this.cts?.handle();
  }
}
// 使用示例
const context = new Context();
const stateA = new StateA(context);
context.to(stateA);
while(1){
  try {
    context.do();
  } catch {
    console.log('肯定输了!');
    break;
  }
}

对照例子理解

见下面代码:

不使用状态设计模式实现上述代码功能:

class Context {
  state = 'A';
  to(state: string) {
    console.log(`Transitioning to state ${state}`);
    this.state = state;
  }
  do() {
    if(this.state === 'A'){
      console.log("买票");
      this.to('B');
    } else if (this.state === 'B') {
      console.log("坐车");
      this.to('C');
    } else if (this.state === 'C') {
      console.log("看球");
      this.to('D');
    } else if (this.state === 'D') {
      throw new Error('已经结束了');
    }
  }
}
const context = new Context();
while(1){
  try {
    context.do();
  } catch {
    console.log('肯定输了!');
    break;
  }
}

【对比】虽然这样看起来代码量好像少了一些,但是如果老铁想要在下车后去趟卫生间,使用了状态设计模式的代码只需要修改StateB的实现就可以了,而后者则必须修改Context中的do方法!

优点

缺点

应用

状态模式常见于需要根据对象的内部状态来改变其行为的场景,例如【订单状态的处理】、【游戏角色的状态转换】等。

它提供了一种可扩展的方式来处理状态相关的逻辑,并促进了代码的灵活性和可维护性。

generator函数可以看成原生js实现了状态设计模式。

感性记忆

同一个对象,当其内部维护的状态不同的时候,调用其上的同一个方法,可能会得到完全不同的结果。

总结

就是适用于同一个对象具有不同的状态,并且在各个状态下表现不一致的情况;这些状态之间如果是可以相互转换的,使用此设计模式就更加合适了。

到此这篇关于JS设计模式之状态模式的用法使用方法的文章就介绍到这了,更多相关JS状态模式使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文