十八.状态模式
状态模式:
State:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
把状态的判定逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
Demo:
//维护一个ConcreteState子类的实例,定义当前的状态
class Context
{
private State state;
public Context(State state)//定义Context的初始状态
{
this.state = state;
}
public State State//读写当前状态和设置新状态
{
get { return state; }
set
{
state = value;
Console.WriteLine("当前状态:"+state.GetType().Name);
}
}
//对请求做处理,并设置一下状态
public void Request()
{
state.Handle(this);
}
}
abstract class State
{
public abstract void Handle(Context context);
}
classConcreteStateA : State
{
public override void Handle(Context context)
{
context.State = newConcreteStateB();//设置下一状态
}
}
class ConcreteStateB : State
{
public override void Handle(Context context)
{
context.State = new ConcreteStateA();//设置下一状态
}
}
classProgram
{
static void Main(string[] args)
{
Context c = new Context(new ConcreteStateA());
c.Request();
c.Request();
c.Request();
c.Request();
Console.ReadKey();
}
}
Demo2:
public class Work
{
private State current;
public Work()
{
current = new ForenoonState();
}
private double hour;
public double Hour
{
get { return hour; }
set { hour = value; }
}
private bool finish = false;
public bool TaskFinished
{
get { return finish; }
set { finish = value; }
}
public void SetState(State s)
{
current = s;
}
public void WriteProgram()
{
current.WriteProgram(this);
}
}
public abstract class State
{
public abstract void WriteProgram(Work w);
}
public class ForenoonState : State//上午工作状态
{
public override void WriteProgram(Work w)
{
if (w.Hour < 12)
{
Console.WriteLine("当前时间:{0}点 上午工作,精神百倍", w.Hour);
}
else
{
w.SetState(new NoonState());
w.WriteProgram();
}
}
}
Work w = new Work();
w.Hour=1;
w.WriteProgram();
w.Hour=2;
w.WriteProgram();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述