State Pattern(状态模式)

模式简介

       状态模式是一种行为型设计模式,适用于对象内部状态发生改变时需要表现出不同的行为,使得行为与状态相对应,并对二者进行解耦。

       常见的应用场景:有限状态机、订单处理、文档编辑器、电梯控制系统、线程管理和游戏开发等。

模式结构

  1. Context(上下文): 定义客户端感兴趣的接口,并维护一个具体状态类的实例,即当前状态对象。

  2. State(状态): 定义一个接口或抽象类,封装与Context的一个特定状态相关的行为。

  3. ConcreteState(具体状态): 实现State接口或继承State抽象类,每一个具体状态类对应Context的一个具体状态,负责实现与该状态相关的行为。

工作原理

  1. Context委托行为: Context对象内部维护一个对当前状态对象的引用,而客户端与Context进行交互。Context将客户端的请求委托给当前状态对象来处理。

  2. 状态切换: 当Context对象的状态发生变化时,它会切换到新的具体状态对象。这个切换过程可能是由Context自身管理,也可能由具体状态类来管理,具体取决于实现。

  3. 状态间的解耦: 状态模式的关键在于将不同状态的行为封装在不同的状态类中,从而使得Context的行为与其状态无关,实现了状态与行为的解耦。

  4. 灵活性和可扩展性: 状态模式使得增加新的状态变得相对容易,因为可以添加新的具体状态类而不需要修改Context的代码。这也使得状态模式对于扩展系统的状态和行为变得非常灵活。

代码示例(C#)

提示:可在本栏目的资源篇“设计模式代码示例合集”下载所有完整代码资源。

灯的状态:LightState.cs


namespace StatePattern;

// 灯的状态
enum LightState
{
    TurnOn, TurnOff
}

// 灯的状态接口
interface ILightState
{
    // 处理逻辑
    LightState Handle();
}

// 开灯状态
class TurnOn : ILightState
{
    public LightState Handle()
    {
        Console.WriteLine("正在开灯...");
        return LightState.TurnOn;
    }
}

// 关灯状态
class TurnOff : ILightState
{
    public LightState Handle()
    {
        Console.WriteLine("正在关灯...");
        return LightState.TurnOff;
    }
}

灯:Light.cs


namespace StatePattern;

// 灯
class Light
{
    // 灯的状态
    public LightState state { get; private set; }

    private ILightState turnOn; // 开灯状态
    private ILightState turnOff; //关灯状态

    public Light()
    {
        state = LightState.TurnOff;
        turnOn = new TurnOn();
        turnOff = new TurnOff();
    }

    // 改变灯的状态
    public void ChangeState(LightState lightState)
    {
        if (lightState == LightState.TurnOn) state = turnOn.Handle();
        else state = turnOff.Handle();
    }
}

测试代码:Program.cs

// ************* 23.状态模式测试 **************
using StatePattern;

// 创建实例
Light light = new Light();

// 输出灯当前的状态
Console.WriteLine("Light state:" + light.state);

// 开灯并输出灯当前的状态
light.ChangeState(LightState.TurnOn);
Console.WriteLine("Light state:" + light.state);

// 关灯并输出灯当前的状态
light.ChangeState(LightState.TurnOff);
Console.WriteLine("Light state:" + light.state);

代码解说

       上述代码模拟了灯的开关状态。开灯和关灯状态实现统一的接口方法,灯保留两种状态的实例,当灯的状态改变时,会在控制台打印输出不同的信息。状态改变会表现出不同的行为。

如果这篇文章对你有帮助,请给作者点个赞吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值