模式简介
状态模式是一种行为型设计模式,适用于对象内部状态发生改变时需要表现出不同的行为,使得行为与状态相对应,并对二者进行解耦。
常见的应用场景:有限状态机、订单处理、文档编辑器、电梯控制系统、线程管理和游戏开发等。
模式结构
-
Context(上下文): 定义客户端感兴趣的接口,并维护一个具体状态类的实例,即当前状态对象。
-
State(状态): 定义一个接口或抽象类,封装与Context的一个特定状态相关的行为。
-
ConcreteState(具体状态): 实现State接口或继承State抽象类,每一个具体状态类对应Context的一个具体状态,负责实现与该状态相关的行为。
工作原理
-
Context委托行为: Context对象内部维护一个对当前状态对象的引用,而客户端与Context进行交互。Context将客户端的请求委托给当前状态对象来处理。
-
状态切换: 当Context对象的状态发生变化时,它会切换到新的具体状态对象。这个切换过程可能是由Context自身管理,也可能由具体状态类来管理,具体取决于实现。
-
状态间的解耦: 状态模式的关键在于将不同状态的行为封装在不同的状态类中,从而使得Context的行为与其状态无关,实现了状态与行为的解耦。
-
灵活性和可扩展性: 状态模式使得增加新的状态变得相对容易,因为可以添加新的具体状态类而不需要修改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);
代码解说
上述代码模拟了灯的开关状态。开灯和关灯状态实现统一的接口方法,灯保留两种状态的实例,当灯的状态改变时,会在控制台打印输出不同的信息。状态改变会表现出不同的行为。
如果这篇文章对你有帮助,请给作者点个赞吧!