设计模式学习笔记——状态模式(state)
1.特点:当对象内状态改变而执行不同操作时考虑,状态转移逻辑不在if/switch中,而在各子类之间,增/改状态和状态转换较容易。
2.概念:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
3.类图:
4.程序实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | /// <summary> /// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。 /// </summary> public class Context { private State state; /// <summary> /// 定义Context的初始状态 /// </summary> /// <param name="state"></param> public Context(State state) { this .state = state; } /// <summary> /// 可读写的状态属性,用于读取和设置新状态 /// </summary> public State State { get { return state; } set { state = value; } } /// <summary> /// 对请求做处理,并设置下一个状态 /// </summary> public void Request() { state.Handle( this ); } } /// <summary> /// 抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为 /// </summary> public abstract class State { public abstract void Handle(Context context); } /// <summary> /// 具体状态类,每一个子类实现一个与Context的一个状态相关的行为 /// </summary> public class ConcreteStateA : State { /// <summary> /// 设置ConcreteStateA的下一个状态是ConcreteStateB /// </summary> /// <param name="context"></param> public override void Handle(Context context) { Console.WriteLine( "当前状态是 A." ); context.State = new ConcreteStateB(); } } public class ConcreteStateB : State { /// <summary> /// 设置ConcreteStateB的下一个状态是ConcreteSateA /// </summary> /// <param name="context"></param> public override void Handle(Context context) { Console.WriteLine( "当前状态是 B." ); context.State = new ConcreteStateA(); } } class Program { static void Main( string [] args) { // 设置Context的初始状态为ConcreteStateA Context context = new Context( new ConcreteStateA()); // 不断地进行请求,同时更改状态 context.Request(); context.Request(); context.Request(); context.Request(); Console.Read(); } } |
分类:
设计模式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构