论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
物联网
›
物联网
›
少一点If/Else - 状态模式(State Pattern)
少一点If/Else - 状态模式(State Pattern)
反转基因福娃
论坛元老
|
2025-1-16 17:28:31
|
显示全部楼层
|
阅读模式
楼主
主题
1047
|
帖子
1047
|
积分
3141
状态模式(State Pattern)
状态模式(State Pattern)是一种行为型计划模式,它允许对象在其内部状态改变时改变其行为。这个模式的核心思想是将对象的行为封装在不同的状态类中,每个状态类都实现了雷同接口或继承自同一个抽象类。通过这种方式,当对象的状态发生变化时,它可以动态地更改其行为,避免了大量的条件分支语句(if-else 或 switch-case)。
属实有点抽象,还是举个现实中的例子
我们举一个H2O的例子,H2O是水的化学元素符号。但是水又有一个特点,在温度低于0摄氏度(尺度大气压下面)的情况下,水是以固态的形式存在;温度在100摄氏度以上的时候以气态形式存在;在0摄氏度到100摄氏度之间的时候以液态形式存在。这个例子反应的就是我们本次要介绍的状态模式(State Pattern),即水这个对象在某一个状态转变的时候,以不同的形式存在。
状态模式(State Pattern)概述
状态模式(State Pattern)结构图
状态模式(State Pattern)涉及的角色
情况类(Context):情况类拥有对状态对象的引用,并且提供了客户端访问状态的方法。它还负责管理状态的变化。
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);
}
}
复制代码
抽象状态(State):这是一个接口或抽象类,声明白所有详细状态必须实现的方法。这些方法定义了不同状态下对象的行为。
public interface State {
void handle(Context context);
}
复制代码
详细状态(ConcreteState):详细状态实现了State接口,每个详细状态类都包含了与该状态相关的行为逻辑。
public class ConcreteStateA implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State A");
// 改变状态
context.setState(new ConcreteStateB());
}
}
public class ConcreteStateB implements State {
@Override
public void handle(Context context) {
System.out.println("Handling request in State B");
// 改变状态
context.setState(new ConcreteStateA());
}
}
复制代码
talk is cheap, show you my code
我们还是利用本次要介绍的状态计划模式来实现我们前面说的谁人例子。
// 抽象状态类
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);
}
@Override
public void heat() {
System.out.println("Water is melting from solid to liquid.");
water.setState(new LiquidState(water));
}
@Override
public void cool() {
System.out.println("Water is already in solid state. Cannot cool further.");
}
}
// 具体状态类:液态
class LiquidState extends State {
public LiquidState(Water water) {
super(water);
}
@Override
public void heat() {
System.out.println("Water is evaporating from liquid to gas.");
water.setState(new GasState(water));
}
@Override
public 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);
}
@Override
public void heat() {
System.out.println("Water is already in gas state. Cannot heat further.");
}
@Override
public 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());
}
}
复制代码
输出结果
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)。
淘汰条件语句:通过将不同状态下的行为转移到相应的状态类中,淘汰了情况类中可能出现的大量条件判定语句。
提高可读性和可维护性:每个状态都有本身的类,这有助于更好地组织代码,提高代码的可读性和可维护性。
状态模式重要应用在对象出现出在不同状态显示出不一样的行为的时候。状态模式提供了一种有用的方式来解耦对象与其行为之间的关系,使得对象可以在不破坏封装的条件下,根据其内部状态的变化而改变行为。这对于构建具有复杂状态逻辑的应用程序特殊有用。理解如何正确使用状态模式可以资助开辟者构建更加模块化、机动且易于维护的软件体系。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
反转基因福娃
论坛元老
这个人很懒什么都没写!
楼主热帖
设计模式---组合模式
Spark快速上手(4)Spark核心编程-Spark ...
【Unity3D】Transform组件
拿到12家offer,想给大家分享一下面试 ...
【渗透攻击】PowerShell与Shell 有什么 ...
Linux的目录结构
使用 Kubeadm 部署 K8S安装
[工具使用]SqlMap
echarts使用及遇到的问题
软件工程经济学第一章
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Mysql
云原生
移动端开发
DevOps与敏捷开发
分布式数据库
快速回复
返回顶部
返回列表