状态模式
状态模式用于解决系统中复杂对象的状态转移以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时,可以使用状态模式。可以使用if…else语句但是会比较复杂。特别是出现新的状态时,代码的扩展性很差。
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
状态模式有3种角色:
1.Context(环境类):环境类又称上下文类,它时拥有多种状态的对象。其中维护一个抽象状态类的实例,这个实例定义当前的状态,在具体实现时,它是State子类的对象。
2.State(抽象状态类):用于定义一个接口以封装与环境类的一个特定状态相关的行为,声明了各种不同状态对应的方法,而在其子类中实现了这些方法。
3.ConcreteState(具体状态类):每一个具体状态类实现一个与环境类的一个状态相关的行为,对应环境类的一个具体状态。
抽象状态类:
abstract class State
{
//声明抽象业务方法,不同的具体状态类可以有不同的实现
public abstract void Handle();
}
具体状态类:
abstract ConcreteState:State
{
public override void Handle()
{
//方法具体实现代码
}
public void ChangeState(Context ctx)
{
if(ctx.value==1)
ctx.SetState(new ConcreteStateA());
else
ctx.SetState(new ConcreteStateB());
}
}
环境类维持一个对抽象状态类的引用,通过SetState方法可以注入不同的状态对象。在环境类的业务方法中调用状态对象的方法。
环境类:
class Context
{
private State state; //维持一个对抽象状态对象的引用
private int value; //其他属性值,该属性值的变化可能会导致对象的状态发生变化
//设置状态对象
public void SetState(State state)
{
this.state = state;
}
public void Request()
{
//其他代码
state.Handle();//调用状态对象的业务方法
//其他代码
}
}