state模式出发点在于类似于if else和switch case这样的分支语句,当分支语句条件数目比较庞大时,看懂或者维护这样的代码很困难。例如,山东项目需求的数据对比功能,简单深度5的三叉树结构,用if语句去实现,就要用的近150行代码(起初是用逻辑表达式将每个节点的前置条件算出,这样减少了if的次数,但是代码可读性变差)。
如果在三叉树内部任意加入一个节点,效果会如何?任何和该节点关联的path都要修改,造成代码维护的困难。
state模式关注与状态之间的转换,其设计思路是为所有状态抽象出一个类,里面暴露了所有状态的行为接口。每个状态都有一个具体类。然后设置一个Context类,用来给用户提供服务,这点和Strategy模式一致。不同之处在于,context传递了自身的指针给State类,用户进行的行为操作,转由State类去判断和执行(调用子类的操作)。这样,用户只需要在context下达命令,具体的判断和操作转由state去判断和执行(用户只关心状态转换是否成功,并不关心状态时怎么转换的)。当维护状态关系时,只需要修改各concreteState即可。
state模式的类图如下所示: