2009年10月1日星期四

State 状态设计模式

类(CLASS)在一般情况下是用来表示事物的,比如File,Car等类。如果用来表示状态,就要用到状态设计模式。现实中的事物在不同的状态下会表现不同的动作。例如女孩Girl这个对象,在心情好的时候,你请她看电影,他会说:好呀,在心情不好的时候,他会对你说:不去。所以Gilr.Invite()这个动作,会随着状态的不同做不同的反应。这个情况用下面的例子表示:


public class Girl
{
//代表心情好
private static int STATE_ORDINARY = 0;
//代表心情坏
private static int STATE_IN_BAD_MOOD = 1;
//心情状态,初期为-1
private int state = -1;
//改变心情状态
public void changeState(int state)
{
this.state = state;
}
//对邀请看电影的后的反应动作。
public string invite()
{
if (state == STATE_ORDINARY)
{
return "好呀";
} else if (state == STATE_IN_BAD_MOOD)
{
return "讨厌";
} else
{
return "...";
}
}


有一天女孩喜欢上你了,状态的改变,反应又不一样了。心情好的时候,会说:太高兴了。不好的时候会说:我们去喝咖啡吧。如果用上面的代码,就要修改invite动作的if else ,修改类内部代码显然是我们不希望的。这是为什么要引进状态设计模式的原因。

//状态设计模式下的Girl类

public class StatePatternGirl
{
private State state = null;
private void changeState(State state)
{
this.state = state;
}
public string invite()
{
return this.state.invite();
}
}
//状态的接口,动作在具体状态类中实现。
interface State
{
public string invite();
}

class BadMoodState : State
{
public string invite()
{
return "去喝咖啡吧";
}
}

class OrdinaryState : State
{
public string morningGreet()
{
return "好高兴呀";
}
}

这样,既可以修改状态的动作,又可以保持StatePatternGirl 这个类的一致,这就是状态设计模式。

没有评论:

发表评论