论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
物联网
›
物联网
›
状态模式
状态模式
冬雨财经
金牌会员
|
2025-1-25 04:22:02
|
显示全部楼层
|
阅读模式
楼主
主题
975
|
帖子
975
|
积分
2925
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
在软件开辟过程中,我们经常会碰到这样的情况:一个对象的行为会随着其内部状态的改变而发生变化。例如,一个手机在差别状态下(开机、关机、静音等)对类似的操作(如来电)会有差别的反应。传统的解决方案可能会利用大量的条件判断语句(如 if - else 或 switch - case)来处理差别状态下的行为,但这种方式会使代码变得痴肥、难以维护和扩展。状态模式(State Pattern)应运而生,它提供了一种优雅的方式来处理对象状态变化及其对应的行为变化。
状态模式概述
状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变其行为,就好像对象修改了它的类一样。状态模式主要包含以下几个角色:
情况类(Context)
:也称为上下文,它持有一个状态对象的引用,界说了客户端感兴趣的接口,并将与状态相关的操作委托给当前的状态对象来处理。
抽象状态类(State)
:界说了一个接口,用于封装与情况类的一个特定状态相关的行为。
详细状态类(ConcreteState)
:实现抽象状态类中界说的接口,每个详细状态类对应情况类的一个详细状态,实现该状态下的详细行为。
状态模式代码示例
以下是利用 Java 语言实现状态模式的示例代码。以一个简朴的电梯控制体系为例,电梯有 “运行”、“制止” 两种状态,并且在差别状态下对 “开门”、“关门” 操作有差别的响应。
// 抽象状态类
abstract class LiftState {
protected LiftContext liftContext;
public void setLiftContext(LiftContext liftContext) {
this.liftContext = liftContext;
}
public abstract void open();
public abstract void close();
public abstract void run();
public abstract void stop();
}
// 运行状态类
class RunningState extends LiftState {
@Override
public void open() {
System.out.println("电梯正在运行,无法开门");
}
@Override
public void close() {
System.out.println("电梯正在运行,门已关闭");
}
@Override
public void run() {
System.out.println("电梯正在运行");
}
@Override
public void stop() {
System.out.println("电梯停止运行");
liftContext.setState(liftContext.getStoppedState());
}
}
// 停止状态类
class StoppedState extends LiftState {
@Override
public void open() {
System.out.println("电梯停止,门打开");
}
@Override
public void close() {
System.out.println("电梯停止,门关闭");
liftContext.setState(liftContext.getRunningState());
}
@Override
public void run() {
System.out.println("电梯开始运行");
liftContext.setState(liftContext.getRunningState());
}
@Override
public void stop() {
System.out.println("电梯已停止");
}
}
// 环境类
class LiftContext {
private LiftState state;
private RunningState runningState = new RunningState();
private StoppedState stoppedState = new StoppedState();
public LiftContext() {
this.state = stoppedState;
runningState.setLiftContext(this);
stoppedState.setLiftContext(this);
}
public void setState(LiftState state) {
this.state = state;
}
public RunningState getRunningState() {
return runningState;
}
public StoppedState getStoppedState() {
return stoppedState;
}
public void open() {
state.open();
}
public void close() {
state.close();
}
public void run() {
state.run();
}
public void stop() {
state.stop();
}
}
public class StatePatternDemo {
public static void main(String[] args) {
LiftContext liftContext = new LiftContext();
liftContext.open();
liftContext.close();
liftContext.run();
liftContext.stop();
liftContext.open();
}
}
复制代码
在上述代码中,LiftState 是抽象状态类,界说了电梯在差别状态下可执行的操作接口。RunningState 和 StoppedState 是详细状态类,分别实现了电梯在 “运行” 和 “制止” 状态下的详细行为。LiftContext 是情况类,持有当前电梯的状态,并将对电梯的操作委托给当前状态对象。在 main 方法中,我们模拟了电梯的一系列操作,展示了状态模式下电梯在差别状态下的行为变化。
状态模式的应用场景
游戏开辟
:游戏角色在差别状态下(如站立、奔跑、跳跃、受伤等)对用户输入(如按键操作)会有差别的反应。通过状态模式,可以将差别状态下的行为封装在各自的详细状态类中,使代码结构更加清晰,易于维护和扩展。
工作流体系
:在工作流体系中,任务可能处于差别的状态(如待处理、处理中、已完成等),并且在差别状态下对各种操作(如分配任务、提交任务等)有差别的处理方式。状态模式可以很好地处理这种情况,将工作流的状态管理和行为处理分离。
装备状态管理
:对于各种装备(如打印机、空调等),它们在差别状态下(如开启、关闭、故障等)对用户操作(如打印指令、温度调治等)的响应差别。利用状态模式可以方便地实现装备状态的管理和相应行为的处理。
状态模式的优缺点
长处
清晰的状态管理
:状态模式将对象的状态和行为封装在差别的详细状态类中,使得代码结构更加清晰,易于理解和维护。每个状态类专注于实现该状态下的特定行为,符合单一职责原则。
易于扩展
:当需要添加新的状态或修改现有状态的行为时,只需要创建新的详细状态类或修改现有状态类的代码,而不需要在大量的条件判断语句中举行修改,符合开闭原则。
提高可维护性
:避免了利用大量的条件判断语句,使得代码更加轻便,淘汰了堕落的可能性。同时,当状态变化时,只需要修改相应状态类的代码,而不会影响其他状态的行为。
缺点
增加类的数量
:由于每个状态都需要一个详细的状态类来实现,可能会导致类的数量增加,使项目的代码结构变得复杂。在小型项目中,这种复杂性可能会显得过于冗余。
状态转换逻辑复杂
:在一些复杂的应用场景中,状态之间的转换逻辑可能会变得复杂,需要仔细设计和维护状态转换的条件温顺序,否则可能会导致状态转换错误或不符合预期的行为。
结语
希望本文能帮助您更好地理解状态模式的概念及实在际应用。如果您有任何疑问或发起,请随时留言交换。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
冬雨财经
金牌会员
这个人很懒什么都没写!
楼主热帖
信息与网络安全期末复习(完整版) ...
iOS全埋点解决方案-手势采集 ...
ts保姆级教程,别再说你不会ts了 ...
如何通过JDBC访问MySQL数据库?手把手 ...
Elasticsearch学习系列五(零停机索引 ...
Fastjson反序列化
Pod概述
Linux安装PHP8 新版笔记
《ABP Framework 极速开发》教程首发 ...
Java 将HTML转为XML
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
Oracle
前端开发
移动端开发
SQL-Server
DevOps与敏捷开发
分布式数据库
网络安全
Java
Mysql
快速回复
返回顶部
返回列表