有时候写程序时,你有没有碰到过要维护很多状态从而写很多条件判断(if...else...)语句?比如一个简单的开关,有“开”和“关”状态,按下开关可以切换这两个状态:
- void switch()
- {
- if (state == ON)
- state = OFF;
- else
- state = ON;
- }
如果它还分高中低三档,按一次开关可以在这几种状态中切换:
- void switch()
- {
- if (state == OFF)
- state = LOW;
- else if (state == LOW)
- state = MIDDLE;
- else if (state == MIDDLE)
- state = HIGH;
- else if (state == HIGH)
- state = OFF;
- }
如果以后设计改变,要让OFF状态直接跳到HIGH,而不是LOW,这个条件又要更改。至今为止还能接受,毕竟只有一个条件分支,咬咬牙也忍了。如果这个开关是按的,而是扭(旋转)呢?左旋让状态由高到低,而右旋让状态由低到高。
- void rotateRight()
- {
- if (state == OFF)
- state = LOW;
- else if (state == LOW)
- state = MIDDLE;
- else if (state == MIDDLE)
- state = HIGH;
- else if (state == HIGH)
- state = OFF;
- }
- void rotateLeft()
- {
- if (state == OFF)
- state = HIGH;
- else if (state == HIGH)
- state = MIDDLE;
- else if (state == MIDDLE)
- state = LOW;
- else if (state == LOW)
- state = OFF;
- }
如果有这样两个动作,以后设计改变时,想把三档改成五档,就要同时改动rotateLeft和rotateRight,当状态变得很多时,代码就变得极容易出错。如果一个设计有更多的动作时(rotateLeft就是一个动作),状态的改变会变得很难维护。
如果把每个状态都抽取出来作为一个类呢?
- interface State
- {
- virtual State* rotateLeft() = 0;
- virtual State* rotateRight() = 0;
- };
简化描述,只考虑On和Off的状态:
- class OnState : State
- {
- public:
- virtual State* rotateLeft() { return new OffState; }
- vritual State* rotateRight() { return new OffState; }
- };
- class OffState : State
- {
- public:
- virtual State* rotateLeft() { return new OnState; }
- vritual State* rotateRight() { return new OnState; }
- };
对于client这边就以简化它的逻辑了:
- class Client
- {
- void rotateLeft() { this->state = this->state->rotateLeft(); }
- void rotateRight() { this->state = this->state->rotateRight(); }
- };
以后状态的增加或改变都不需要影响Client的代码。而且因为没有了繁琐的条件语句,代码也变得好维护了。
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态模式与策略模式的比较:
这两种模式在类图上看是基本相同的:客户拥有一个接口(状态或策略),当有新的状态或策略加入时,其必须实现这个接口。客户则只需直接对这个接口操作,而不用管那些实现了接口的具体状态或策略。
两种模式的区别在于:策略模式偏重于行为,每个新加入的类都描述了一个算法;而状态模式偏向于状态,每个新加入的类描述了一个状态。
阅读(869) | 评论(0) | 转发(0) |