最近做实验时用到了State设计模式,虽然老师说State设计模式要到以后讲,但通过自学我已经基本明白其要点,不妨在此写一些东西。
我们知道,软件在运行过程中,会产生很多的状态,状态就是指软件所处的某一种相对稳定的形式,在这里我要解释清楚它和软件基线的区别。软件的基线是指软件本身所处的相对稳定的形式,是整体性的稳定,而状态是指软件的某一部分在运行过程中所处的相对稳定状态,是局部的稳定。之所以要设计状态模式,是因为在很多情况下,不同的状态对应的操作不同。对于分情况讨论的问题,在结构化程序设计中,我们通常采用if-else语句或switch语句进行处理。但是这样书写对于代码的修改很不利,如果某一处需要修改,很有可能会引起大改,正所谓“牵一发而动全身”。同时,程序的可读性,扩展性也会变得很弱。维护也会很麻烦。因此,在面向对象编程中,我们采用状态设计模式以规避这种弱点。
状态设计模式的主要思想是将每一个状态都设置成类,对于不同的类定义不同的操作,包括该状态下的处理以及状态之间的转换等。在调用时,我们不需要使用条件处理语句,而是根据需要调用不同的状态对应的类来实现,这样就大大增加了程序的可读性和可扩展性,同时,因为状态对应的类之间耦合程度很低,仅在状态变换时进行耦合,因此在修改状态时我们只需要修改需要修改的状态对应的类,而不涉及其他的类,这样就大大降低了修改状态需要的工作量,避免“牵一发而动全身”的情况出现。
状态设计模式主要分为三大部分:状态接口,环境变量,具体状态。状态接口定义了与用户所需要的状态相关联的行为,环境变量用于定义客户程序需要的接口,并且维护一个具体状态的实例,具体状态实现了状态接口所定义的操作。下面我们就来解释一下上述三大部分。状态接口定义的不是状态,定义的是所有的状态通用的行为。注意,在状态设计模式中,所有的状态都是直接设计成类,不存在其他形式。比如定义一个机器,它可以显示当前所处的状态并转换到下一个状态,那么我们就把显示和转换两种操作定义在状态接口内部。具体状态就是每一个具体的状态,我们知道,使用状态设计模式的前提就是不同的状态对应不同的操作,具体状态的作用就是体现这种不同。我们可以把不同的操作定义在具体状态类内,作为转换的对象,例如对于上面的机器,相同的接口可以有不同的实现,不同的实现就应该放在具体类内。特别要注意的是,状态设计模式中具体模式之间一般会形成一个封闭系统。环境变量的作用最为特殊也最难解释。简单来说,环境变量的主要作用就是调用具体状态类实现操作。将状态作为环境变量类的属性,在环境变量类内实现状态接口的操作。注意:环境变量的主要作用是实现状态接口中的操作,而具体状态中的操作通过环境变量实现。总结起来就是:状态接口定义操作,环境变量实现操作,具体状态通过调用环境接口实现操作的变化。