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

开头

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


内容

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

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

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

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

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


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


客户端


显示结果



总结

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

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

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

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

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

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


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

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


猜你喜欢

转载自blog.csdn.net/fjxcsdn/article/details/80546559