State状态模式属于行为型设计模式,该模式允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
Design Pattern:State 🔗
基本介绍 🔗
构成 🔗
- Context:上下文类,定义客户交互的接口,持有具体状态对象的引用,并用来更改当前的状态。
- State:抽象状态类,定义一个接口,用于封装与上下文的特定状态相关的行为。
- ConcreteState:具体状态类,实现了Context的一个状态所对应的行为。
优点 🔗
- 该模式使封装了转换规则,使状态转换变得明确。
- 状态对象可以共享,不同的Context可以使用同一个State。
- 代码结构更加清晰,不同行为分不到不同State里。
缺点 🔗
- 增加上下文类和状态类对象的个数。
实例 🔗
C#中状态模式的实例,游戏工作室开张喽了,开始第一个功能开发,策划案子->程序开发->QA验收。
/// <summary>
/// 上下文类
/// </summary>
public class Context
{
private FunctionState _functionState;
public Context(FunctionState state)
{
_functionState = state;
}
/// <summary>
/// 状态切换
/// </summary>
/// <param name="state"></param>
public void ChangeState(FunctionState state)
{
_functionState = state;
}
/// <summary>
/// 执行
/// </summary>
public void Execute()
{
_functionState.Action();
}
}
/// <summary>
/// 抽象状态类 - 功能开发
/// </summary>
public abstract class FunctionState
{
/// <summary>
/// 执行
/// </summary>
public abstract void Action();
}
/// <summary>
/// 具体状态类 - 策划状态
/// </summary>
public class PlanningState : FunctionState
{
public override void Action()
{
Console.WriteLine("我是策划,策划文档已经审核完毕。");
}
}
/// <summary>
/// 具体状态类 - 程序状态
/// </summary>
public class EngineerState : FunctionState
{
public override void Action()
{
Console.WriteLine("我是程序,功能开发完毕。");
}
}
/// <summary>
/// 具体状态类 - 测试状态
/// </summary>
public class TestingState : FunctionState
{
public override void Action()
{
Console.WriteLine("我是测试,功能验收完毕。");
}
}
实际运行:
PlanningState planningState = new PlanningState();
EngineerState engineerState = new EngineerState();
TestingState testingState = new TestingState();
Context context = new Context(planningState);
context.Execute();
context.ChangeState(engineerState);
context.Execute();
context.ChangeState(testingState);
context.Execute();
结论 🔗
搬砖愉快!