博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS常用的设计模式(17)—— 状态模式
阅读量:4607 次
发布时间:2019-06-09

本文共 1704 字,大约阅读时间需要 5 分钟。

状态模式主要可以用于这种场景

1 一个对象的行为取决于它的状态

2 一个操作中含有庞大的条件分支语句

回想下街头霸王的游戏。

隆有走动,攻击,防御,跌倒,跳跃等等多种状态,而这些状态之间既有联系又互相约束。比如跳跃的时候是不能攻击和防御的。跌倒的时候既不能攻击又不能防御,而走动的时候既可以攻击也可以跳跃。

要完成这样一系列逻辑, 常理下if else是少不了的. 而且数量无法估计, 特别是增加一种新状态的时候, 可能要从代码的第10行一直改到900行.

if ( state === 'jump' ){    if ( currState === 'attack' || currState === 'defense' ){      return false;    } }else if ( state === 'wait' ){    if ( currState === 'attack' || currState === 'defense' ){      return true;    } }

为了消灭这些if else, 并且方便修改和维护, 我们引入一个状态类.

var StateManager = function(){   var currState = 'wait';   var states = {     jump: function( state ){     },     wait: function( state ){     },     attack: function( state ){     },     crouch: function( state ){     },     defense: function( state ){       if ( currState === 'jump'  ){           return false;  //不成功,跳跃的时候不能防御       }     //do something;     //防御的真正逻辑代码, 为了防止状态类的代码过多, 应该把这些逻辑继续扔给真正的fight类来执行.     currState = 'defense'; //  切换状态     }   }   var changeState = function( state ){     states[ state ] && states[ state ]();   }   return {       changeState  : changeState   } } var stateManager = StateManager(); stateManager.changeState( 'defense' );

通过这个状态类,可以把散落在世界各地的条件分支集中管理到一个类里,并且可以很容易的添加一种新的状态。而作为调用者,只需要通过暴露的changeState接口来切换人物的状态。

/***************************分界线1******************************************/

GOF提出的23种设计模式,至此已经写完大半。还有一些要么是js里不太适用,要么是js中已有原生自带的实现,所以就没再去深究。这2篇文章里 的大部分例子都来自或改写自工作和学习中的代码。我对设计模式的看法是不用刻意去学习设计模式,平时我们接触的很多代码里已经包含了一些设计模式的实现。 我的过程是读过prototype和jquery的源码后,回头翻设计模式的书,发现不知觉中已经接触过十之六七。

同样在实际的编码中也没有必要刻意去使用一些设计模式。就如同tokyo hot 32式一样,在一场友好的papapa过程中,没有必要去刻意使用某种姿势。一切还是看需求和感觉。

posted on
2015-02-05 09:37 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/jymz/p/4273974.html

你可能感兴趣的文章
机器学习库--dlib
查看>>
路人甲的主角梦
查看>>
Oracle基础 06 控制文件 controlfile
查看>>
C# DateTime显示时间格式的使用
查看>>
log4net日志组件
查看>>
jquery图片过滤归类应用
查看>>
断点续传JAVA实现
查看>>
Jenkins插件之Publish Over SSH/CIFS/FTP
查看>>
寻找OEP
查看>>
TableView下拉cell
查看>>
面试题:升高的温度
查看>>
Android学习-使用单例模式实现一键退出APP
查看>>
Android-L-Samples
查看>>
判断特征中是否含有空值、空值填充
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
luffy项目的接口开发
查看>>
3DMAX导出FBX的烘焙动画选项
查看>>
spring依赖注入之构造函数注入,set方法注入
查看>>
k8s用kubectl管理应用升级,服务发布与回滚,扩缩容
查看>>
【每天一题ACM】可重复组合数的实现,求解素数解组合Prime Solutions
查看>>