状态模式

  状态模式允许对象在内部状态改变时改变它的行为,对象看起来像是修改了它的类。

  状态模式将状态封装成独立的类,并将动作委托到代表当前状态的对象。

  “看起来像是修改了它的类”:从客户的视角来看,如果说你使用的对象,能够完全改变它的行为,那么你会觉得,这个类是从别的地方实例化来的。然而实际上,这是在使用组合,通过简单引用不同的状态对象来造成类改变的假象。

  状态模式与策略模式之比较:

  状态模式将一群行为封装在状态对象中,context的行为随时可以委托到那些状态对象中的一个。随着时间的流逝,当前状态在对象集合中游走改变,以反映出context内部的状态,所以context的行为也会跟着改变。我们可以将状态模式想象成不用在context中放置许多条件判断的替代方案。

  策略模式 客户通常主动指定context所要组合的策略对象是哪一个,现在,固然策略模式让我们具有弹性,能够在运行时改变策略但对于某个context对象来说,通常都只有一个最适当的策略对象。我们可以将策略模式想象成除了继承之外的一种弹性替代方案。

  该模式相对而言不是很难理解,这里写个大致思路,就不写代码了。。。

  1. 定义一个状态接口(IState),在这个接口里面定义所有的行为(MethodA,MethodB,MethodC。。。);

  2. 编写状态类实现上述定义的接口,每个类负责自己的行为,比如ClassA实现行为MethodA。。。并且在具体条件下(执行的某个会触发状态改变的行为)改变状态;

  3. 将行为委托给对应的状态对象处理。

原文地址:https://www.cnblogs.com/hachun/p/3622889.html