状态模式-State
名称:
状态模式(State Pattern)-对象行为模式
问题:
The State pattern allows an object to alter its behavior when its internal state changes. The object appears to change its class.
允许一个对象在其内部状态改变时改变她的行为。对象看起来似乎修改了它的类。
适用性:
-一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
-一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其它对象而独立变化。
协作:
-Context将于状态相关的请求委托给当前的ConcreteState对象处理。
-Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。
-Context是客户使用的主要接口。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。
-Context或ConcreteState子类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。
优点和缺点:
1、它将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
2、它使得状态转换显式化。
3、State对象可被共享。
解决方案:
1、 模式的参与者
1、Context
-定义客户感兴趣的接口。
2、State
-定义一个接口以封装与Context的一个特定状态相关的行为。
3、ConcreteState subclasses
-每一个子类实现一个与Context的一个状态相关的行为。
2.实现方式
class Context { private State state; public Context() { this.state=new ConcreteStateA(); } public void setState(State state) { this.state=state; } public State getState() { return state; } public void Handle() { state.Handle(this); } }
abstract class State { public abstract void Handle(Context context); }
class ConcreteStateA extends State { public void Handle(Context context) { context.setState(new ConcreteStateB()); } }
class ConcreteStateB extends State { public void Handle(Context context) { context.setState(new ConcreteStateA()); } }
参考资料
《设计模式:可复用面向对象软件的基础》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具