设计模式(状态变化)——状态模式
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
场景还原(地铁口):
地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以 ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm))。
有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移)。
通常我们在实现这类系统会使用到很多的 Switch/Case 语句,Case 某种状态,发生什么动作,Case 另外一种状态,则发生另外一种状态。但是这种实现方式至少有以下两个问题:
当状态数目不是很多的时候,Switch/Case 可能可以搞定。但是当状态数目很多的时候(实际系统中也正是如此),维护一大组的 Switch/Case 语句将是一件异常困难并且容易出错的事情。
状态逻辑和动作实现没有分离。在很多的系统实现中,动作的实现代码直接写在状态的逻辑当中。这带来的后果就是系统的扩展性和维护得不到保证。
UML类图阐述:
1)Context将与状态相关的请求委托给当前的ConcreteState对象处理;
2)Context可以将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可以访问Context;
3)Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道;
模式结构:
- Context: 环境类
- State: 抽象状态类
- ConcreteState: 具体状态类
更多C++示例代码,请移步到本人的github。
设计模式,祝愿你把代码写成艺术。
6/23/2017 11:39:57 AM