1分钟设计模式State Pattern

Posted 码哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1分钟设计模式State Pattern相关的知识,希望对你有一定的参考价值。

    状态模式属于行为型模式该模式旨在通过改变对象内部状态改变其行为,以便在增删改状态代码时对象不受影响。

    

    现实中的示例为应急响应机制,如防汛抗旱、公共卫生、突发灾害等应急响应机制,对应职能部门在不同的级别的应急响应状态下,所执行的方案也不同。

    我们这里抽象比喻一下(可能存在描述错误,请指正),我们将整职能部门简单抽象为三个层级,乡镇、地方、国家,在不同级别的应急响应状态下,这三个层级的职能部门所做出的行为也不同,例如:四级响应可能只需乡镇、地方参与,而四级提升到二级响应则需要乡镇、地方、国家均参与,假设需要增加一个N级响应状态,只需再出台一个N级状态下各级职能部门职责的规定即可,而不需要修改其他响应状态的规定(如《国家防汛抗旱应急预案》)。也就是在不同的状态下,对于相同的类型的事件,对象所做的行为也不同,这个示例中应急响应级别就是状态,执行的方案就是对象的行为。


    状态模式类图如下。

    如上类图示例为电梯,如类图所示电梯(Lift)和状态(State)为组合关系,状态假定有四种:开、关、上升、下降,如果我们不使用状态模式,电梯的四个方法中将存在大量的判断,以open方法为例,轿厢内按下开电梯门按钮需要判断是否是关闭状态、电梯是否在上升或下降等,如果电梯增加一种新的状态停运,则需要修改电梯类。但是如果我们使用状态模式,就如上类图所示,电梯的方法不在电梯内部实现,而是在对应的状态中实现,并且状态的切换也可以对应的状态实现类中实现,这样如果电梯增加一种新的状态:停运,只需扩展一个状态的实现类OffState而不需修改电梯类。


    状态模式主要用在对象存在多种状态,且多种状态下对象的行为需要表现的不同,这种情况下为了满足开闭原则,将不同的状态单独维护,而对象内部保存状态和状态转换的机制即可,当有需要编写新的状态的代码时,不需要修改原有对象,只需增加内部状态的实现类即可。另外状态模式的状态是会随着环境而变化的,也就是说使用状态模式的对象还需要存在状态的变化。

以上是关于1分钟设计模式State Pattern的主要内容,如果未能解决你的问题,请参考以下文章

设计模式实战-状态模式(State Pattern)

状态模式(State Pattern)

设计模式之- 状态模式(State Pattern)

状态模式(State Pattern)

设计模式 —— 状态模式(State Pattern)

秒懂设计模式之状态模式(State Pattern)