状态模式
定义
对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,当一个对象内在改变时允许其改变行为,这个对象看起来像改变了其类。
- State:抽象状态角色,接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。
- ConcreteState:具体状态角色,职责是本状态的行为管理以及趋向状态处理,也就是本状态需要处理的事情以及本状态如何过度到其他状态。
- Context:环境角色,定义客户端需要的接口,并且负责具体状态的切换。
具体实现:
1 | public abstract class State { |
1 | public class ConcreteState1 extends State{ |
1 | public class Context { |
优点
- 结构清晰,减少if…else和switch…case使用,避免程序复杂性,提高系统的可维护性。
- 遵循设计原则,体现了单一职责和开闭原则,每个状态都是一个子类,要增加状态就修改子类。
- 封装性好,状态变换放到类的内部实现,外不调用不用知道类的内部是如何实现的。
缺点
- 子类会太多,出现类膨胀。
使用场景
- 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式。
- 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。
注意事项
状态模式适用于当某个对象在他的状态发生改变时,他的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不要超过五个。
代码:GitHub
欢迎关注公众号: