1.概述
状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中的某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化。对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处理。
又称状态对象(Objects for States)。
2.结构
(1)Context(环境类):又称上下文类,它是拥有多种状态的对象。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个state子类的对象。
(2)State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,在子类中实现这些方法。
(3)ConcreteState(具体状态类):每一个具体状态类实现一个与环境类的一个状态相关的行为,对应一个环境类的一个具体状态。
3.实现
namespace State
{
public abstract class State
{
public abstract void Handle();
}
public class ConcreteState : State
{
public override void Handle()
{
//--
}
}
public class Context
{
private State state;
private int value;
public void SetState(State state)
{
this.state = state;
}
public void Request()
{
state.Handle();
}
public void SetValue(int value)
{
this.value = value;
}
public int GetValue()
{
return value;
}
public void ChangeState()
{
if (value == 0)
{
SetState(new ConcreteState());
}
/*
else if ()
{
}
...
*/
}
}
}
4.优缺点
(1)状态模式封装了状态的转换规则,在状态模式中可以将状态的转换代码封装在华宁类或者具体状态类中可以对状态转换代码进行集中管理。
(2)状态模式将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象即可使环境类对象拥有不同的行为。
(3)避免使用庞大的条件语句将业务方法和状态转换代码交织在一起。
(4)可以让对个环境对象共享一个状态对象,从而减少类的个数。
(1)会增加系统中类的数量。
(2)结构和实现较为复杂。
(3)增加新的状态类可能需要修改负责状态转换的代码。