允许一个对象在其内部状态改变时改变它的行为,常用于实现有限状态机,如角色的行走,跳跃,攻击等。
// 抽象状态类
public abstract class State
{
// 定义一个环境角色,提供子类访问
protected Context context;
// 设置环境角色
public void SetContext(Context context)
{
this.context = context;
}
// 行为1
public abstract void Handle1();
// 行为2
public abstract void Handle2();
}
// 具体状态A类
public class ConcreteStateA : State
{
// 行为1的具体实现
public override void Handle1()
{
Console.WriteLine("ConcreteStateA handles request1.");
Console.WriteLine("ConcreteStateA wants to change the state of the context.");
// 切换状态
this.context.TransitionTo(new ConcreteStateB());
}
// 行为2的具体实现
public override void Handle2()
{
Console.WriteLine("ConcreteStateA handles request2.");
}
}
// 具体状态B类
public class ConcreteStateB : State
{
// 行为1的具体实现
public override void Handle1()
{
Console.WriteLine("ConcreteStateB handles request1.");
}
// 行为2的具体实现
public override void Handle2()
{
Console.WriteLine("ConcreteStateB handles request2.");
Console.WriteLine("ConcreteStateB wants to change the state of the context.");
// 切换状态
this.context.TransitionTo(new ConcreteStateA());
}
}
// 环境类
public class Context
{
// 维护一个抽象状态对象的引用
private State state;
// 设置初始状态
public Context(State state)
{
this.TransitionTo(state);
}
// 允许改变状态对象
public void TransitionTo(State state)
{
Console.WriteLine($"Context: Transition to {state.GetType().Name}.");
this.state = state;
this.state.SetContext(this);
}
// 对请求做出处理,并设置下一个状态
public void Request1()
{
this.state.Handle1();
}
public void Request2()
{
this.state.Handle2();
}
}
// 测试代码
class Program
{
static void Main(string[] args)
{
// 创建一个初始状态为A的环境对象
var context = new Context(new ConcreteStateA());
// 调用请求方法,观察状态的变化和行为的执行
context.Request1();
context.Request2();
Console.ReadKey();
/*
* 输出结果:
* Context: Transition to ConcreteStateA.
* ConcreteStateA handles request1.
* ConcreteStateA wants to change the state of the context.
* Context: Transition to ConcreteStateB.
* ConcreteStateB handles request2.
* ConcreteStateB wants to change the state of the context.
* Context: Transition to ConcreteStateA.
*/
}
}