【转】设计模式学习笔记(20)-状态
状态模式(Status)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。这个定义看起来十分抽象,什么意思呢?就是说一个对象需要在不同的环境下作出不同的处理过程。你会说,这很简单啊,条件语句就可以了,但是条件语句只适用于简单的情况,想象一下,如果一个对象有10中不同的状态,然后在每个状态上都需要有不同的表现,使用条件语句简直就是噩梦啊,所以产生了状态模式。
状态模式的核心在于一个对象可以在运行时改变自己的行为。这其实和后面所要说的策略模式的目的是一样的。改变自己的行为?根据自己的状态改变,也即在不同的场合说不同的话,有条不紊。我们很容易想到应该将经常变化的部分抽离出来,放在一个独立的部分,然后在不同的场合下取出不同的状态对象,这就是状态模式了(尼玛啊,我怎么听着还是像策略模式?)
我们来画个类图吧:
类图还是很简单的:
Context是上面所说的要根据不同状态有不同行为的对象,State是所有状态的接口,有一个Handle方法,ConcreteStateA和ConcreteStateB是两个实现类啦,如果有很多状态的话可以继承多个类。
接下来码代码吧:
|
1
2
3
4
5
|
class State {public: virtual void Handle() = 0;}; |
这是State接口(不用说也知道)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Context{private: State* _state;public: void SetState(State* state) { this->_state = state; } State* GetState() { return this->_state; } void Request() { _state->Handle(); }}; |
这是Context,有一个状态变量_state存储当前状态
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class ConcreteStateA : public State{public: void Handle() { cout << "This is state A" << endl; }};class ConcreteStateB : public State{public: void Handle() { cout << "This is state B" << endl; }}; |
两个实现类
|
1
2
3
4
5
|
Context context;context.SetState(new ConcreteStateA());context.Request();context.SetState(new ConcreteStateB());context.Request(); |
主方法
输出结果
|
1
2
|
This is state AThis is state B |
代码还是一如既往地坑爹,这代码设计得毫无水准啊,但这还真是状态模式呢(你硬要说是策略模式我也没意见)。我们可以明显地看到所有与状态相关的代码全部转移到State接口的实现类中去了,逻辑简单明了啊。
得,还是来说一说适用性吧:
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为
- 一个操作中含有庞大的多分枝的条件语句,且这些分支依赖于该对象的状态
面向对象有这点好处,类的数据一般没有限制。于是各种结构化程序编写便以多个类代替,利用虚继承来实现,简化了程序的编写但逻辑却变得复杂了。
posted on 2013-03-05 16:33 TheKingOfKingFish 阅读(135) 评论(0) 收藏 举报
浙公网安备 33010602011771号