当前位置: 首页 > news >正文

设计模式之:状态模式(State Pattern)

状态模式(State Pattern)

状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为。这种模式通过把状态的变化逻辑分布到State的子类之间,减少了相互间的依赖,使得状态的切换更加清晰。

状态模式的关键是将那些会随着状态改变而改变的行为抽离出来,使得状态和行为可以独立变化,不同状态下的行为可以分别管理和修改,增加新的状态或者改变状态间的转换逻辑变得更加容易。

使用状态模式的好处:
  • 封装了转换规则:状态之间的转换操作被封装在状态类中,易于修改和扩展。
  • 消除了庞大的条件分支语句:状态模式通过多态性来消除原本过多的条件分支语句。
  • 将状态的逻辑与对象的其它行为分离:这有助于集中处理对象在某一状态下的行为。

示例:简单的工作状态切换

假设我们有一个工作任务(Task)对象,这个对象有几个状态:New(新创建的任务),InProgress(正在进行的任务),Completed(已完成的任务)。我们可以使用状态模式来设计这个场景。

步骤 1:定义状态接口

首先,定义一个状态接口和实现该接口的具体状态类。

interface State {void proceed(Task task);
}class New implements State {public void proceed(Task task) {System.out.println("Task is starting.");task.setState(new InProgress());}
}class InProgress implements State {public void proceed(Task task) {System.out.println("Task is in progress.");task.setState(new Completed());}
}class Completed implements State {public void proceed(Task task) {System.out.println("Task is already completed.");}
}
步骤 2:创建 Context 类

然后,创建包含状态的Task类。

class Task {private State state;public Task() {// 任务默认状态为 Newthis.state = new New();}public void setState(State state) {this.state = state;}public void proceed() {state.proceed(this);}
}
步骤 3:使用状态模式

最后,演示如何使用状态模式来改变Task对象的状态。

public class StatePatternDemo {public static void main(String[] args) {Task task = new Task();task.proceed(); // Task is starting.task.proceed(); // Task is in progress.task.proceed(); // Task is already completed.}
}

在这个示例中,Task对象的行为随着其内部状态的改变而改变,而且状态的变更逻辑被封装在状态对象内部。这样,如果未来需要添加新的状态或者改变状态转换的逻辑,我们只需要修改或添加相应的状态类,而不需要触及到Task类的内部逻辑,这就是使用状态模式的好处。

http://www.lryc.cn/news/300717.html

相关文章:

  • 【微服安全】API密钥和令牌与微服务安全的关系
  • Mock.js
  • 【c++】list详细讲解
  • C#面:在.NET中 类 System.Web.UI.Page 可以被继承吗?
  • AI:128-基于机器学习的建筑物能源消耗预测
  • php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)
  • MongoDB聚合操作符:$acos
  • 开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
  • 微软.NET6开发的C#特性——委托和事件
  • 卷积神经网络的基本结构
  • python:使用GDAL库读取遥感影像指定行列数/经纬度坐标的像素值
  • Redis篇----第一篇
  • C语言-----用二维数组解决菱形的打印问题
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • css篇---移动端适配的方案有哪几种
  • 一、部署Oracle
  • 11-编写自动化测试
  • 爱上JVM——常见问题(一):JVM组成
  • C#系列-EF扩展框架AutoMapper应用实例(40)
  • DataX源码分析-插件机制
  • 容器高级知识: 适配器模式与 Sidecar 模式的区别
  • 使用Xdisplay将ipad作为扩展显示器Agent闪退问题
  • DVXplorer事件相机入门
  • ubuntu屏幕小的解决办法
  • 黑群晖一键修复:root、AME、DTS、转码、CPU型号等
  • Repo命令使用实例(三十八)
  • 2024年华为OD机试真题-分披萨-Python-OD统一考试(C卷)
  • 找负环(图论基础)
  • 无人机飞控算法原理基础研究,多旋翼无人机的飞行控制算法理论详解,无人机飞控软件架构设计
  • 关于内存相关的梳理