少一点If/Else - 状态模式(State Pattern)

devtools/2025/1/17 8:51:39/

状态模式(State Pattern)

状态模式(State Pattern)

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。这个模式的核心思想是将对象的行为封装在不同的状态类中,每个状态类都实现了相同接口或继承自同一个抽象类。通过这种方式,当对象的状态发生变化时,它可以动态地更改其行为,避免了大量的条件分支语句(if-else 或 switch-case)。

属实有点抽象,还是举个现实中的例子
我们举一个H2O的例子,H2O是水的化学元素符号。但是水又有一个特点,在温度低于0摄氏度(标准大气压下面)的情况下,水是以固态的形式存在;温度在100摄氏度以上的时候以气态形式存在;在0摄氏度到100摄氏度之间的时候以液态形式存在。这个例子反应的就是我们本次要介绍的状态模式(State Pattern),即水这个对象在某一个状态转变的时候,以不同的形式存在。

状态模式(State Pattern)概述

状态模式(State Pattern)结构图

在这里插入图片描述

状态模式(State Pattern)涉及的角色

  1. 环境类(Context):环境类拥有对状态对象的引用,并且提供了客户端访问状态的方法。它还负责管理状态的变化。
java">public class Context {private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;System.out.println("Current state set to " + state.getClass().getSimpleName());}public void request() {state.handle(this);}
}
  1. 抽象状态(State):这是一个接口或抽象类,声明了所有具体状态必须实现的方法。这些方法定义了不同状态下对象的行为。
java">public interface State {void handle(Context context);
}
  1. 具体状态(ConcreteState):具体状态实现了State接口,每个具体状态类都包含了与该状态相关的行为逻辑。
java">public class ConcreteStateA implements State {@Overridepublic void handle(Context context) {System.out.println("Handling request in State A");// 改变状态context.setState(new ConcreteStateB());}
}public class ConcreteStateB implements State {@Overridepublic void handle(Context context) {System.out.println("Handling request in State B");// 改变状态context.setState(new ConcreteStateA());}
}

talk is cheap, show you my code

我们还是利用本次要介绍的状态设计模式来实现我们前面说的那个例子。

java">// 抽象状态类
abstract class State {protected Water water;public State(Water water) {this.water = water;}public abstract void heat();public abstract void cool();
}// 具体状态类:固态
class SolidState extends State {public SolidState(Water water) {super(water);}@Overridepublic void heat() {System.out.println("Water is melting from solid to liquid.");water.setState(new LiquidState(water));}@Overridepublic void cool() {System.out.println("Water is already in solid state. Cannot cool further.");}
}// 具体状态类:液态
class LiquidState extends State {public LiquidState(Water water) {super(water);}@Overridepublic void heat() {System.out.println("Water is evaporating from liquid to gas.");water.setState(new GasState(water));}@Overridepublic void cool() {System.out.println("Water is freezing from liquid to solid.");water.setState(new SolidState(water));}
}// 具体状态类:气态
class GasState extends State {public GasState(Water water) {super(water);}@Overridepublic void heat() {System.out.println("Water is already in gas state. Cannot heat further.");}@Overridepublic void cool() {System.out.println("Water is condensing from gas to liquid.");water.setState(new LiquidState(water));}
}// 环境类:水
class Water {private State state;public Water() {state = new SolidState(this); // 假设初始状态为固态}public void setState(State state) {this.state = state;}public void heat() {state.heat();}public void cool() {state.cool();}public String getState() {return state.getClass().getSimpleName().replace("State", "");}
}// 测试类
public class WaterStatePatternDemo {public static void main(String[] args) {Water water = new Water();System.out.println("Current state: " + water.getState());water.heat();System.out.println("Current state: " + water.getState());water.heat();System.out.println("Current state: " + water.getState());water.cool();System.out.println("Current state: " + water.getState());water.cool();System.out.println("Current state: " + water.getState());}
}

输出结果

java">Current state: Solid
Water is melting from solid to liquid.
Current state: Liquid
Water is evaporating from liquid to gas.
Current state: Gas
Water is condensing from gas to liquid.
Current state: Liquid
Water is freezing from liquid to solid.
Current state: Solid

在这个例子中,Water类作为环境类持有一个State对象的引用,该对象表示水的当前状态。State是一个抽象类,定义了加热(heat)和冷却(cool)的方法。每种具体状态(固态、液态、气态)都实现了这些方法,并在方法内部包含了状态转换的逻辑。

总结

状态模式的优点

  • 简化对象的操作:状态模式将与特定状态相关的操作封装到状态类中,使得环境类可以专注于其他功能而不必处理复杂的状态逻辑。
  • 遵循开闭原则:新增加的状态只需要创建新的具体状态类,而不需要修改现有的代码,这符合面向对象设计中的开闭原则(Open/Closed Principle)。
  • 减少条件语句:通过将不同状态下的行为转移到相应的状态类中,减少了环境类中可能出现的大量条件判断语句。
  • 提高可读性和可维护性:每个状态都有自己的类,这有助于更好地组织代码,提高代码的可读性和可维护性。

状态模式主要应用在对象呈现出在不同状态显示出不一样的行为的时候。状态模式提供了一种有效的方式来解耦对象与其行为之间的关系,使得对象可以在不破坏封装的前提下,根据其内部状态的变化而改变行为。这对于构建具有复杂状态逻辑的应用程序特别有用。理解如何正确使用状态模式可以帮助开发者构建更加模块化、灵活且易于维护的软件系统。


http://www.ppmy.cn/devtools/151226.html

相关文章

7.User-Agent(用户代理)

User-Agent 即用户代理,简称“UA”,它是一个特殊字符串头。网站服务器通过识别 “UA”来确定用户所使用的操作系统版本、CPU 类型、浏览器版本等信息。而网站服务器则通过判断 UA 来给客户端发送不同的页面 网络爬虫使用程序代码来访问网站,…

Spring6.0新特性-HTTP接口:使用@HttpExchange实现更优雅的Http客户端

文章目录 一、概述二、使用1、创建接口HttpExchange方法2、创建一个在调用方法时执行请求的代理3、方法参数4、返回值5、错误处理(1)为RestClient(2)为WebClient(3)为RestTemplate 注意 一、概述 官方文档…

《小迪安全》学习笔记05

目录 读取: 写入: (其中的读取和写入时我认为比较重要的,所以单独做成了目录,这里的读取和写入是指在进行sql注入的时候与本地文件进行的交互) 好久没发博客了。。。从这篇开始的小迪安全学习笔记就开始…

1.5 安装Kuboard在页面上熟悉k8s集群

本节重点总结: Kuboard 是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用 具体…

利用 Java 爬虫获取 1688 商品评论的实践指南

在电商领域,商品评论是消费者决策的重要参考因素,同时也是商家了解产品反馈、优化服务的关键数据来源。1688 作为国内知名的 B2B 电商平台,拥有海量的商品评论数据。本文将详细介绍如何利用 Java 爬虫技术获取 1688 商品评论,并提…

神经网络作为一种强大的人工智能技术

一、神经网络概述 神经网络是一种模拟人类大脑神经元结构和功能的计算模型,它由大量的节点(神经元)和连接这些节点的边组成,通过学习数据中的模式和关系来执行各种任务,如分类、回归、预测、图像识别、自然语言处理等。神经网络在人工智能领域取得了巨大的成功,广泛应用…

【机器学习:二十二、机器学习项目开发的技巧】

机器学习项目开发的技巧 机器学习项目的开发不仅仅依赖于算法的选择和模型的调优,还需要良好的项目管理技巧和方法论。以下是机器学习项目开发中的关键技巧: 明确需求:在项目启动之前,明确问题定义和业务目标。例如,…

消息中间件的基础概念入门

目录 一、什么是消息中间件 1.1、简介 1.2、消息中间件的主要作用 解耦合 异步通信 负载均衡 可靠性与持久性 消息路由与调度 削峰 事务支持 监控与审计 跨平台和跨语言支持 二、常用消息中间件对比 2.1、 RabbitMQ 2.1.1、特点 2.1.2、适用场景 2.2、Apache K…