实现同一方法在不同状态下执行不同的操作
状态的切换的工作交给具体状态负责,
因为Context依赖抽象或接口,并非依赖具体状态,所以状态切换与context之间实现了解藕。
先看代码:
abstract class State
{
public abstract void Handle(Context context);
}
{
public abstract void Handle(Context context);
}
class ConcreteStateA:State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
{
public override void Handle(Context context)
{
context.State = new ConcreteStateB();
}
}
class ConcreteStateB:State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();
}
}
class Context
{
private State state;
public Context(State state)
{
this.state = state;
}
{
private State state;
public Context(State state)
{
this.state = state;
}
public State State
{
get { return state; }
set { state = value;
Console.WriteLine("当前状态:" + state.GetType().Name);
}
}
public void Request()
{
state.Handle(this);
}
}
入口函数:
class Program
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());
c.Request();
}
}
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());
c.Request();
}
}
以上代码意思就是,在A、B两种状态之间切换。
我们可以给State类增加一个抽象方法
public abstract void Dothing();
然后再ConcreteStateA、ConcreteStateB两类当中重写这个抽象方法。
public override void Dothing();