javascript设计模式 – 状态模式原理与用法实例分析
本文实例讲述了javascript设计模式 – 状态模式原理与用法。分享给大家供大家参考,具体如下:
介绍:状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式将一个对象的状态从该对象中分离出来,使得对象状态可以灵活变化。
定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,其别名为状态对象,状态模式是一种对象行为型模式。
场景:在很多情况下我们的页面需要做一些状态判断,是否注册,是否登录,剩余金额是否大于500等等,我们通常是在组件中通过if…else…来做不同的处理,这种方式耦合严重不满足单一职责原则。如何解决这个问题呢,这一节我们利用状态模式来解决对象的状态切换。
示例:
var dialog = function(){ var _state = null; this.setstate = function(state){ _state = state; } this.getstate = function(){ return _state; } } var showstate = function(){ this.doaction = function(dialog){ console.log("对dialog设置显示状态:"); dialog.setstate(this); } this.tostring = function(){ console.log("显示中......"); } } var hidestate = function(){ this.doaction = function(dialog){ console.log("对dialog设置隐藏状态:"); dialog.setstate(this); } this.tostring = function(){ console.log("已隐藏......"); } } var dialog = new dialog(); var showstate = new showstate(); var hidestate = new hidestate(); showstate.doaction(dialog); //对dialog设置显示状态: dialog.getstate().tostring(); //显示中...... hidestate.doaction(dialog); //对dialog设置隐藏状态 dialog.getstate().tostring(); //已隐藏......
这个例子里dialog对象有两种状态,显示和隐藏,我把两种状态提取出来,使得状态的管理更加灵活。在这个例子里面dialog称之为环境类,环境类又称为上下文类,他拥有多种状态。环境类内部需要维护一个state对象用来定义当前状态。hidestate,showstate称之为状态类,对应环境类的一个具体状态,tostring称之为状态类的行为,每一个状态类的行为都有所不同。
状态模式总结:
优点:
* 封装了状态的转换规则,在状态模式中可以将状态的转换代码封装在环境类或者具体状态类中,方便对状态转换代码进行管理。
* 将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境对象拥有不同行为
缺点:
* 状态模式的使用必然会增加系统中状态类的数量,导致开销变大。
* 结构设计交付为咋,使用不当会导致程序结构和代码混乱,增加系统设计难度。
适用场景:
* 对象的行为依赖于它的状态,状态改变将导致行为的变化
* 在代码中包含大量与对象状态有关的条件语句
感兴趣的朋友可以使用在线html/css/javascript代码运行工具:http://tools.jb51.net/code/htmljsrun测试上述代码运行效果。