陈巧倩

设计模式-状态模式

· 189 words · 1 minutes to read
Categories: CSharp
Tags: Design Pattern

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();

结论 🔗

搬砖愉快!