小谈设计模式(17)—状态模式 青旅半醒 2023-10-16 17:40 29阅读 0赞 #### 小谈设计模式(17)—状态模式 #### * 专栏介绍 * * 专栏地址 * 专栏介绍 * 状态模式 * * 关键角色 * * 上下文(Context) * 抽象状态(State) * 具体状态(Concrete State) * 核心思想 * Java程序实现 * * 首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRequest(): * 然后,我们创建两个具体状态类 ConcreteStateA 和 ConcreteStateB,它们分别实现了抽象状态类 State: * 接下来,我们创建一个上下文类 Context,其中包含一个指向当前状态的引用,并提供了一个方法 setState() 用于切换状态和一个方法 request() 用于处理请求: * 最后,我们可以在客户端代码中使用上下文类来测试状态模式的效果: * 输出结果 * 分析 * 优缺点分析 * * 优点 * 1 * 2 * 3 * 缺点 * 1 * 2 * 总结 ## 专栏介绍 ## ### 专栏地址 ### [link][] ### 专栏介绍 ### 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 ![在这里插入图片描述][e5327429ed0143388bc0e1a894d4bca2.png] ## 状态模式 ## 状态模式是一种行为型设计模式,它允许一个对象在内部状态发生变化时改变其行为。状态模式将对象的行为封装在不同的状态类中,通过改变对象的状态来改变其行为。 ![在这里插入图片描述][ac76ff91b8fd4c7f9cd0ed21de5466d1.png] ### 关键角色 ### #### 上下文(Context) #### 上下文是一个包含状态的对象,它定义了客户端与状态对象的交互接口。上下文中维护了一个指向当前状态的引用,并且在运行时可以切换到不同的状态。上下文将客户端请求委派给当前状态对象处理。 #### 抽象状态(State) #### 抽象状态是一个接口或抽象类,它定义了状态对象的通用行为。具体状态类需要实现这个接口或继承这个抽象类,并且根据具体的状态来实现相应的行为。 #### 具体状态(Concrete State) #### 具体状态是实现抽象状态的具体类。每个具体状态类都代表了上下文在特定状态下的行为。具体状态类负责处理上下文的请求,并在需要时切换到其他状态。 ![在这里插入图片描述][d625e462823c4948aca032479868b98f.png] ### 核心思想 ### 将状态的判断和状态的行为分离,使得状态的变化不影响行为的变化。通过将状态的行为封装在具体状态类中,可以方便地添加新的状态或修改现有状态的行为,同时也避免了状态判断的复杂性。 ![在这里插入图片描述][6e9fd6b39a0146c09f4c9c7aa2f15daf.png] ### Java程序实现 ### #### 首先,我们定义一个抽象状态类 State,其中包含一个处理请求的方法 handleRequest(): #### public abstract class State { public abstract void handleRequest(); } #### 然后,我们创建两个具体状态类 ConcreteStateA 和 ConcreteStateB,它们分别实现了抽象状态类 State: #### public class ConcreteStateA extends State { @Override public void handleRequest() { System.out.println("处理请求,当前状态为A"); } } public class ConcreteStateB extends State { @Override public void handleRequest() { System.out.println("处理请求,当前状态为B"); } } #### 接下来,我们创建一个上下文类 Context,其中包含一个指向当前状态的引用,并提供了一个方法 setState() 用于切换状态和一个方法 request() 用于处理请求: #### public class Context { private State currentState; public Context() { // 初始化为初始状态 currentState = new ConcreteStateA(); } public void setState(State state) { currentState = state; } public void request() { currentState.handleRequest(); } } #### 最后,我们可以在客户端代码中使用上下文类来测试状态模式的效果: #### public class Client { public static void main(String[] args) { Context context = new Context(); // 处理请求,当前状态为A context.request(); // 切换状态为B context.setState(new ConcreteStateB()); // 处理请求,当前状态为B context.request(); } } #### 输出结果 #### 处理请求,当前状态为A 处理请求,当前状态为B #### 分析 #### 在上述示例中,我们通过状态模式实现了一个简单的上下文对象 Context,它可以根据不同的状态来处理请求。通过切换状态,上下文对象可以改变其行为。这样,我们可以方便地添加新的状态类或修改现有状态的行为,而不需要修改客户端代码。 ![在这里插入图片描述][1a373cc955284585b4665e2bfc8ebd23.png] ### 优缺点分析 ### #### 优点 #### #### 1 #### 通过将状态的行为封装在具体状态类中,可以使得状态的变化对客户端透明,客户端只需要与上下文进行交互,不需要关心具体的状态。 #### 2 #### 增加新的状态类相对容易,符合开闭原则,不需要修改现有的代码。 #### 3 #### 将状态的行为集中到具体状态类中,使得代码更加清晰,易于维护和扩展。 #### 缺点 #### #### 1 #### 当状态的行为比较少或简单时,使用状态模式可能会导致类的数量增加,增加了代码的复杂性。 #### 2 #### 如果状态之间存在相互转换的复杂逻辑,可能需要引入其他模式来处理状态之间的转换。 ![在这里插入图片描述][fbe8e0d877924824a6237e14d63dc5c4.png] ### 总结 ### 状态模式是一种通过将状态的行为封装在具体状态类中,使得状态的变化不影响行为的设计模式。它可以使代码更加清晰、易于维护和扩展,适用于状态变化较多且状态之间的行为差异较大的场景。 [link]: http://t.csdn.cn/B1YXg [e5327429ed0143388bc0e1a894d4bca2.png]: https://img-blog.csdnimg.cn/e5327429ed0143388bc0e1a894d4bca2.png [ac76ff91b8fd4c7f9cd0ed21de5466d1.png]: https://img-blog.csdnimg.cn/ac76ff91b8fd4c7f9cd0ed21de5466d1.png [d625e462823c4948aca032479868b98f.png]: https://img-blog.csdnimg.cn/d625e462823c4948aca032479868b98f.png [6e9fd6b39a0146c09f4c9c7aa2f15daf.png]: https://img-blog.csdnimg.cn/6e9fd6b39a0146c09f4c9c7aa2f15daf.png [1a373cc955284585b4665e2bfc8ebd23.png]: https://img-blog.csdnimg.cn/1a373cc955284585b4665e2bfc8ebd23.png [fbe8e0d877924824a6237e14d63dc5c4.png]: https://img-blog.csdnimg.cn/fbe8e0d877924824a6237e14d63dc5c4.png
相关 【设计模式】17.状态模式 对象的行为和状态联系在一起 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更新处理 怼烎@/ 2024年03月26日 15:51/ 0 赞/ 30 阅读
相关 小谈设计模式(24)—命令模式 小谈设计模式(24)—命令模式 专栏介绍 专栏地址 专栏介绍 命令模式 角色分析 命令(Comman 心已赠人/ 2024年02月23日 02:27/ 0 赞/ 28 阅读
相关 小谈设计模式(20)—组合模式 小谈设计模式(20)—组合模式 专栏介绍 专栏地址 专栏介绍 组合模式 对象类型 叶节点 ╰半夏微凉°/ 2023年10月16日 17:57/ 0 赞/ 32 阅读
相关 小谈设计模式(19)—备忘录模式 小谈设计模式(19)—备忘录模式 专栏介绍 专栏地址 专栏介绍 备忘录模式 主要角色 发起人(Ori 「爱情、让人受尽委屈。」/ 2023年10月16日 17:47/ 0 赞/ 32 阅读
相关 小谈设计模式(17)—状态模式 小谈设计模式(17)—状态模式 专栏介绍 专栏地址 专栏介绍 状态模式 关键角色 上下文(Conte 青旅半醒/ 2023年10月16日 17:40/ 0 赞/ 30 阅读
相关 小谈设计模式(13)—外观模式 小谈设计模式(13)—外观模式 专栏介绍 专栏地址 专栏介绍 外观模式 主要目的 角色分析 逃离我推掉我的手/ 2023年10月16日 17:12/ 0 赞/ 32 阅读
相关 小谈设计模式(10)—原型模式 小谈设计模式(10)—原型模式 专栏介绍 专栏地址 专栏介绍 原型模式 角色分类 抽象原型(Prot 亦凉/ 2023年10月16日 16:54/ 0 赞/ 33 阅读
相关 小谈设计模式(8)—代理模式 小谈设计模式(8)—代理模式 专栏介绍 专栏地址 专栏介绍 代理模式 代理模式角色分析 抽象主题(S た 入场券/ 2023年10月16日 16:47/ 0 赞/ 25 阅读
相关 小谈设计模式(3)—策略模式 小谈设计模式(3)—策略模式 专栏介绍 专栏地址 专栏介绍 策略模式 主要角色 环境(Context ゞ 浴缸里的玫瑰/ 2023年10月16日 07:26/ 0 赞/ 35 阅读
相关 JavaScript 23 种设计模式之 17 状态模式 JavaScript 23 种设计模式之 17 状态模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 末蓝、/ 2023年03月13日 01:59/ 0 赞/ 35 阅读
还没有评论,来说两句吧...