JavaScript设计模式(十七):超级玛丽-状态模式

简介: 超级玛丽-状态模式

状态模式(State)

当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象。

主要目的就是将条件判断的不同结果转化为状态对象的内部状态。

解决多分支判断问题

  • 一般判断形势 (当新增需求时那么就需要添加新的判断条件)

      // 展示结果
      function showResult(state) {
         
          if (state == 0) {
         
              // 处理结果0
              console.log('这是第一种情况');
          } else if (state == 1) {
         
              // 处理结果1
              console.log('这是第二种情况');
          } else if (state == 2) {
         
              // 处理结果2
              console.log('这是第三种情况');
          } else if (state == 3) {
         
              // 处理结果3
              console.log('这是第四种情况');
          }
      }
    
      showResult(2); // 这是第三种情况
    
  • 状态对象的实现 (状态模式的基本雏形)

      // 投票结果状态对象
      const ResutlState = (function () {
         
          // 判断结果保存在内部状态中
          var State = {
         
              // 每种状态作为一种独立方法保存
              state0: function () {
         
                  // 处理结果0
                  console.log('这是第一种情况');
              },
              state1: function () {
         
                  // 处理结果1
                  console.log('这是第二种情况');
              },
              state2: function () {
         
                  // 处理结果2
                  console.log('这是第三种情况');
              },
              state3: function () {
         
                  // 处理结果3
                  console.log('这是第四种情况');
              }
          };
          // 获取某一种状态并执行其对应的方法
          function show(type) {
         
              State[`state${type}`] && State[`state${type}`]();
          }
          return {
         
              // 返回调用状态方法接口
              show
          }
      }());
    
      ResutlState.show(2); // 这是第三种情况
    

超级玛丽示例:

  • if ... else ...形势判断角色动作:
      // 单动作条件判断 每增加一个动作就需要添加一个判断
      function playerController(state) {
         
          if (state === 'move') {
         
              console.log('移动');
          } else if (state === 'jump') {
         
              console.log('跳跃');
          } else {
         
              console.log('idle');
          }
      }
      // 复合动作对条件判断的开销是翻倍的
      function playerController(state1, state2) {
         
          if (state1 === 'move') {
         
              console.log('移动');
          } else if (state1 === 'move' && state2 === 'shoot') {
         
              console.log('移动射击');
          } else if (state1 === 'jump') {
         
              console.log('跳跃');
          } else if (state1 === 'jump' && state2 === 'shoot') {
         
              console.log('跳跃射击');
          } else if (state1 === 'idle' && state2 === 'shoot') {
         
              console.log('站立射击');
          } else {
         
              console.log('idle');
          }
      }
    
  • 状态优化形势:

      // 创建超级玛丽状态类
      const Player = function () {
         
    
          // 内部状态私有变量(缓存当前状态)
          let _currentState = [];
    
          // 动作与状态方法映射
          const state = {
         
              // 跳跃
              jump() {
          console.log('jump'); },
              // 移动
              move() {
          console.log('move'); },
              // 射击
              shoot() {
          console.log('shoot'); },
              // 蹲下
              squat() {
          console.log('squat'); }
          };
    
          // 动作控制类,返回接口方法 changeState、action
          return {
         
              // 改变状态方法 - 组合动作通过传递多个参数实现
              changeState(...args) {
         
                  // 重置并向内部状态中添加动作
                  _currentState = args;
                  // 返回动作控制类
                  return this;
              },
              // 执行动作
              action() {
         
                  console.log('触发一次动作');
                  // 遍历内部状态保存的动作 - 如果该动作存在则执行
                  _currentState.forEach(key => state[key] && state[key]())
                  return this;
              }
          };
      };
    
      // 创建一个超级玛丽
      const player = new Player();
      player
          .changeState('jump', 'shoot')       // 改变为`跳跃`与`射击`动作组合
          .action()                           // 执行动作             触发一次动作 ---> jump - shoot
          .action()                           // 执行动作             触发一次动作 ---> jump - shoot
          .changeState('shoot')               // 改变为`射击`动作
          .action();                          // 执行动作             触发一次动作 ---> shoot
    

特点:

状态模式既是 解决程序中臃肿的分支判断语句问题,将 每个分支转化为一种 状态 独立出来方便 每种 状态管理不至于每次执行时遍历所有分支

目录
相关文章
|
1月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
253 0
|
6月前
|
设计模式 网络协议 Java
【设计模式】【行为型模式】状态模式(State)
一、入门 什么是状态模式? 状态模式(State Pattern)是一种行为设计模式,允许对象在其内部状态改变时改变其行为,使其看起来像是改变了类。状态模式的核心思想是将对象的状态封装成独立的类,并将
288 16
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
295 124
|
9月前
|
设计模式 Java Go
【再谈设计模式】状态模式~对象行为的状态驱动者
状态模式属于行为型设计模式。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下表现出不同的行为。上下文(Context):这是一个包含状态对象的类,它定义了客户感兴趣的接口,并维护一个具体状态对象的引用。上下文将操作委托给当前的状态对象来处理。抽象状态(State):这是一个抽象类或者接口,它定义了一个特定状态下的行为接口。所有具体的状态类都实现这个接口。具体状态(Concrete State):这些是实现抽象状态接口的类,每个具体状态类实现了与该状态相关的行为。
321 18
|
9月前
|
设计模式 JavaScript 算法
浅谈几种js设计模式
设计模式是软件开发中的宝贵工具,能够提高代码的可维护性和扩展性。通过单例模式、工厂模式、观察者模式和策略模式,我们可以解决不同场景下的实际问题,编写更加优雅和高效的代码。
279 8
|
12月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
173 2
|
设计模式 网络协议 Java
【十五】设计模式~~~行为型模式~~~状态模式(Java)
文章详细介绍了状态模式(State Pattern),这是一种对象行为型模式,用于处理对象在其内部状态改变时的行为变化。文中通过案例分析,如银行账户状态管理和屏幕放大镜工具,展示了状态模式的应用场景和设计方法。文章阐述了状态模式的动机、定义、结构、优点、缺点以及适用情况,并提供了Java代码实现和测试结果。状态模式通过将对象的状态和行为封装在独立的状态类中,提高了系统的可扩展性和可维护性。
【十五】设计模式~~~行为型模式~~~状态模式(Java)
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
271 1
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
设计模式 Java 测试技术
Java设计模式-状态模式(18)
Java设计模式-状态模式(18)
162 0

热门文章

最新文章