行为型模式——状态模式(State)

开头

     今天让我们学习一下状态模式,冯曰:“青春太匆忙,来不及欣赏”随着我们一天天的长大,我们时时刻刻在改变着,这里说的改变是状态的改变,例如今天学习不下去,心情沮丧沉闷,大脑告诉我,你该找师父去聊聊了,给师父聊完天以后,自己又像是打了鸡血一样满血复活,充满着无限战斗了,学习久了,又开始感觉身心俱疲,想骂街,后来大脑告诉我,你看看你都多大孩子了,发怒的时候就应该多看书,书上说:“生气发怒不好,学习本来就是一件主动吃苦的事情,人生不能太一番风顺,愿你归来,仍是此间少年,”结果你又一次改变了,变得由发怒的状态立刻变为平静的状态,上面我啰里叭嗦说了这么多,只是想表达一点,随着人的情绪状态的改变,自己的行为也在发生着变化,行为依赖于状态。


内容

     状态之间的转换,按照我们以前的思路,就是if —else语句,或者Switch—Case语句,当我们增加一个新的状态时,就需要更该原代码,不利于维护,扩展性极差,那么状态模式是如何进行转换的呢?我们可以联想一下职责链模式。

    结合开头的例子,现在给大家分析一下佳兴的状态吧。(状态的转换既可以在环境类中实现,也可以在每一个具体状态类中说实现。)

  状态模式大致分为三类角色,分别为抽象状态角色(State)、具体状态类角色(ConcreteState)、环境类(Context)

抽象状态角色(State):定义一个具体状态公共的行为方法。环境类Context与抽象状态类State之间存在单向关联关系。

具体状态类角色(ConcreteState):实现抽象状态的方法,不同的具体状态类提供完全不同的方法实现,每一个具体状态类的方法不同。


环境类(Context):标识当前状态,也就是将当前的状态注入到环境类中,也可以在环境类调用具体状态的方法,即图片中的Request()。


客户端


显示结果



总结

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

优点  :(1)状态的转换不在if—else语句,而是将状态转换代码封装在了具体状态类里面或者环境类里面。

           (2)每一个具体状态类实现了一个具体的状态行为,可以动态的增加新的状态。

缺点 :(1)具体状态类增多,增大系统运行开销。

           (2) 增加新的状态,状态转换语句需要更改,违背开放封闭原则。

适用环境:一个对象的状态影响其行为,为避免条件语句,可采用状态模式。


关于状态模式,我认为两点很关键:1.每一种具体状态产生了具体的行为,并实现了封装。2.状态之间的转换。

如果本篇博客对于初学者的您有一定的帮助,记得给博主点个赞哦。


封装了一个选项卡,不过已经不像选项卡了-_-!!! 现稍微说明下吧,如果不明白的话,旁边有几个例子可能说明起来更清楚些 obj.bind = ["a1","td","b1","div"]; 绑定id="a1"下的td标签为菜单,绑定id="b1"下的div标签为内容,简单么? td标签的数量和div标签的数量必须相同 (若不需要显示内容,只显示菜单话,可以这个在td标签上加<td skip="true">) 如果id="a1"下的td标签有嵌套表格,这样的话,就不是所有的td都是菜单,这时候需要用下nesting obj.nesting = [false,true,"",""]; 当标签tag有嵌套时,需要用到这个 比如选项卡内容是放在div容器里,而本身这个内容里也有div标签,这时就需要用到 菜单嵌套为false,内容嵌套为true,且会自动判断出内容标签,多数时候这样就可以了 判断方法为,认定getElementsByTagName后第一个标签为内容第一项,其他的就用这个第一项的深度来判断 但有些情况下,这样还是不行 我用后面2个参数做id来指定菜单或者内容的第一项nesting = [false,true,"","q2"]; 这样就肯定不会错了(不明白的话看下例子就简单多了) obj.index = 0; 默认显示第几个选项卡,序号从0开始 obj.style = ["c1","c2","c3"] 菜单加载的样式的className: 菜单未选中的className是c1 菜单选中的className是c2 菜单onmouseover的className是c3 obj.overStyle = false; 选项卡是否有onmouseover, onmouseout变换样式事件[非激活选项卡内容],对应的样式为style[2] obj.overChange = false; 选项卡内容是否用onmouseover, onmouseout直接激活 obj.menu = false; 选项卡是菜单类型 obj.auto = [false, 1000]; 选项卡是否自动播放,播放速度(毫秒) obj.creat(); 开始生成选项卡,需要onclick触发事件的话,可以obj.creat(函数名) 所有的都会触发
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值