定义 :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
状态模式包含如下3个角色:
- Context(环境类):在Context类中维护一个抽象状态类State的实例,这个实例定义了当前状态。
- State(抽象状态类):定义一个接口以封装使用Context的一个特定状态相关的行为。
- ConcreteState(具体状态类):实现抽象状态定义的接口。每一个子类实现一个与Context的一个状态相关的行为。
举例
红绿灯的交替变化
- 环境类
public class Context
{
private State state;//设置默认状态
public Context()
{
state = new ConcreteStateA();
}//设置(切换)状态
public void SetState(State state)
{
this.state = state;
}//供客户使用的方法
public void Request()
{
state.Handle(this);
}
}
- 抽象状态类
public abstract class State
{
//不同状态下都要用的方法(实现不同)
public abstract void Handle(Context context);
}
- 具体状态类
public class ConcreteStateA : State
{
public override void Handle(Context context)
{
Console.WriteLine("绿灯");//直接切换状态
context.SetState(new ConcreteStateB());
}
}public class ConcreteStateB : State
{
public override void Handle(Context context)
{
Console.WriteLine("黄灯");context.SetState(new ConcreteStateC());
}
}public class ConcreteStateC : State
{
public override void Handle(Context context)
{
Console.WriteLine("红灯");context.SetState(new ConcreteStateA());
}
}
- 客户类
class Program
{
static void Main(string[] args)
{
Context context = new Context();//每次调用状态都在改变
context.Request();
context.Request();
context.Request();
context.Request();
}
}
总结:环境类中创建一个状态对象,构造函数中设置默认状态,还有切换状态的set方法,同时提供客户使用的方法,在该方法中调用当前状态的行为,具体状态类中若传入环境类对象,则可以使用环境类中切换状态的方法来改变当前状态。