状态模式案例分析

需求

初始状态下,【暂停按钮】不可点,所有数轴可调:

这里写图片描述

点击【动态波】后,【暂停按钮】可点,所有数轴可调:

这里写图片描述

点击【暂停按钮】后,“暂停”变为“播放”,所有数轴不可调:

这里写图片描述

分析需求

上面的需求很明显可以分为三个状态:初始状态、波动状态、暂停状态。不同的状态下,同一个按钮的表现不一样,比如暂停按钮,在初始状态下不可点,在其它状态下可点。

其实判断是否使用状态模式也是这样考虑:看同一个对象,在整个生命周期中,对同一个事件是否有多种响应。如果有的话,那这个对象就存在多个状态。如果多个对象都有某几个状态(比如都有播放,暂停状态),那就可以考虑使用状态模式了。

使用状态模式的好处是,可以消除分散各处的状态判断的代码。

实现代码

  • 不使用状态模式:
class DomEvent{stop(e){if(this.state === 'waving'){//处理波动状态}else if(this.state === 'stop'){//处理暂停状态}else{//处理初始状态}}/*** 点击波长数轴*/clickWave(e){if(this.state === 'stop'){return;}//...}
}
  • 使用状态模式
export default class DomEvent{//单例static _inst;static getInst(){DomEvent._inst = DomEvent._inst || new DomEvent();return DomEvent._inst;}constructor(){}init(){this.stateList = {"default" : new DefaultState(),"waving" : new WavingState(),"stop" : new StopState()}this.state = this.stateList["default"];return this;}/*** 修改状态*/changeState(stateName){this.state = this.stateList[stateName];}stop(e){this.state.stop(e);}/*** 点击波长数轴*/clickWave(e){this.state.clickWave(e);}
}

具体的状态类可以这样写:

export default class StopState{constructor(){this.domEvents = DomEvent.getInst();}stop(e){this.stopBtn.text("播放");this.domEvents.changeState('waving');}/*** 点击波长数轴*/clickWave(e){//...}
}

这样,每个状态下该做什么,一目了然。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统IP地址

1、IP地址概述 2、配置IP地址 查看IP地址 在网卡上绑定一个IP地址 同一张网卡上绑定多个IP 绑定一块网卡设备 修改或删除IP地址 IP地址概述 这里不多赘述,参考《计算机网络》课程。 配置IP地址 [rootweekend110 ~]# ifconfigeth0    Link encap:Ethernet HWadd…

qwidget多个窗口同步_Linux命令screen—终端切换,工作环境保存,画面同步,防断网...

Screen基础Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。创建一个新的窗…

Linux文件基本操作

使用declare命令创建一个变量名为 tmp 的变量: 使用号赋值运算符为变量 tmp 赋值为 dunzhu: 读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值,初学者经常会忘记输入) 在dunzhu家目录创建一…

DES 加密 解密

EncryptUtil feiyangklDES 一行代码完成DES加密,加密模式 DES CBC DEMO GIF DEMO 简介 最近项目中用到DES加密,在这里整理成篇,供大家参考阅读,在使用该demo过程中,你可能会遇到一些问题,首先你需要看一下…

markdown绘图插件----mermaid简介

作者:黄永刚 mermaid简介 当撰写文档的时候,对于流程图的生成大多使用Visio等繁重的工具,没有一种轻便的工具能够画图从而简化文档的编写,就像markdown那样。 mermaid解决这个痛点,这是一个类似markdown语法的脚本语言…

Java NIO 教程

NIO 概述 NIO有三个核心组件: 通道(Channels)缓冲器(Buffers)选择器(Selectors) 实际上,NIO的组件和类远不止这三个,但这个三个组件是核心。至于其它组件,…

threejs相机和渲染器

渲染器 渲染器其实代表的是canvas标签。 渲染器的类型 WebGLRender 使用WebGL来渲染图形,速度较快,但是有些机器不支持WebGL。 CanvasRender 使用canvas2d来渲染图形,在较老的版本上,主要是用来渲染2D图形。现在这个渲染器在…

threejs概览

threejs术语和概念 threejs的API很长,有很多概念和术语,理解了这些概念和术语,才能更好的使用threejs。这些概念和术语都藏在API右侧的大纲中,下图简单整理了一下这些概念: 这些概念又分为四个大类(见上图…

leetcode数组汇总_[LeetCode] 300. 最长上升子序列

题目链接: https://leetcode-cn.com/problems/longest-increasing-subsequence难度:中等通过率:43.0%题目描述:给定一个无序的整数数组,找到其中最长上升子序列的长度。示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释:…

threejs创建平面几何形状

创建平面几何形状 平面几何形状有三种:点,线,面三种,下面说说用threejs创建这几种形状的方法。 创建点 创建点可以使用Points类。 function createPoints(){//创建一个Geometry,并添加点let geometry new THREE.G…

threejs精灵(Sprite)

Sprite精灵 Sprite叫精灵,计算机图形学中,精灵指包含于场景中的二维图像或动画(wiki)。在threejs中,这样说明Sprtite(doc) : A sprite is a plane that always faces towards the camera , ge…

threejs加载3D模型例子

加载3D模型 首先要引入ColladaLoader加载器,Collada是一个3D模型交换方案,即不同的3D模型可以通过Collada进行相互转换,言外之意,threejs可以使用Collada将3D模型的数据转换成自己支持的格式,从而在浏览器上渲染出来。…

threejs纹理

纹理 纹理用来表现物体的细节。理论上可以将物体的每个细节建模出来,但是这样时间成本和性能成本都太高,因此,将物体的一些细节用纹理来表示。 图片纹理 图片纹理直接在物体表面应用图片。可以使用TextureLoader类的load方法来加载纹理。 …

threejs对象拾取

对象拾取 对象拾取也就是要获得鼠标事件发生位置的图形对象。在threejs中,是通过Raycaster 对象来拾取对象的,ray是射线,caster是投射器,从字面上即可理解其工作原理是:从某个方向发射一条射线,穿过鼠标所…

threejs指定对象旋转中心

指定对象旋转中心 默认情况下,对象的旋转中心都是自身的中心。对于组对象而言,也是如此。因此,可以利用这个特点,实现对象绕任何点旋转,也就是指定旋转中心。比如我们想要下图的对象绕A点旋转 我们可以添加我们的对…

threejs设置对象层次

设置层次 threejs提供了层次的支持。和相机处于同一层次的对象可见,否则不可见。在threejs中,最多可以设置32层,默认的层次是1。层次在有些系统中很有用,可以将不同的模式的对象设成不同的层次,这样,切换模…

Text段、Data段和BSS段

不同的compiler在编译的过程中对于存储的分配可能略有不同,但基本结构大致相同。 大体上可分为三段:Text段、Data段和BSS段。 text段用于存放代码,通常情况下在内存中被映射为只读,但data和bss是可写的。 数据存放通常分成如下几个…

threejs渲染器剔除模式

渲染器剔除模式 渲染器可以设置成舍弃某些面,如前面、背面等,在【WebGLRenderer Constants】中对此有说明。默认情况下,是剔除掉背面,也就是背对着相机的面。下面看看例子: 首先创建一个正方形,给每个面不…

threejs路径

路径 引用百度百科的解释: 路径通常指存在于多种计算机图形设计软件中的以贝塞尔曲线为理论基础的区域绘制方式。路径在Canvas、SVG上都有相关定义,一般用来创建形状。在threejs中,也可以用来创建形状,除此之外,还可…

OpenGL ES 纹理设置

纹理过滤纹理采样最近点采样线性纹理采样MIPMAP纹理纹理过滤 纹理拉伸:重复拉伸和截取拉伸 用于指定纹理坐标超过(00.0,1.0)范围时所发生的行为,使用glTexParameterf函数指定,GL_TEXTURE_WRAP_S 定义 s 坐标超出范围[0.0, 1.0]的情况&#xf…