【再谈设计模式】状态模式~对象行为的状态驱动者

embedded/2025/2/9 11:49:48/

一、引言

        在软件开发,软将工程,软件设计过程中,我们常常会遇到对象的行为依赖于其状态的情况。例如,一个任务对象可能有“未开始”、“进行中”、“已完成”等状态,并且在不同状态下执行相同操作会有不同的结果。传统的方法可能会使用大量的条件判断语句来处理不同状态下的行为,这使得代码复杂、难以维护且不易扩展。而状态模式提供了一种优雅的解决方案,它允许对象在内部状态改变时改变其行为,看起来就像是修改了类本身。

二、定义与描述

        状态模式属于行为型设计模式。它将对象的行为封装在不同的状态类中,使得对象在不同的状态下表现出不同的行为。在状态模式中,有以下几个主要角色:

  • 上下文(Context):这是一个包含状态对象的类,它定义了客户感兴趣的接口,并维护一个具体状态对象的引用。上下文将操作委托给当前的状态对象来处理。
  • 抽象状态(State):这是一个抽象类或者接口,它定义了一个特定状态下的行为接口。所有具体的状态类都实现这个接口。
  • 具体状态(Concrete State):这些是实现抽象状态接口的类,每个具体状态类实现了与该状态相关的行为。

三、抽象背景

        考虑一个简单的订单处理系统。订单有不同的状态,如“已下单”、“已付款”、“已发货”、“已完成”等。在传统的设计中,如果要处理订单在不同状态下的操作(如显示订单状态、执行下一个流程等),可能会有如下的代码:

public class Order {private String state;public Order(String state) {this.state = state;}public void process() {if ("已下单".equals(state)) {System.out.println("订单已下单,等待付款");} else if ("已付款".equals(state)) {System.out.println("订单已付款,准备发货");} else if ("已发货".equals(state)) {System.out.println("订单已发货,等待收货");} else if ("已完成".equals(state)) {System.out.println("订单已完成");}}
}

        这种代码随着状态的增加和操作的复杂化会变得非常难以维护。而使用状态模式可以将每个状态的行为封装到独立的类中,使得代码结构更加清晰。

四、适用场景与现实问题解决

(一)适用场景


http://www.ppmy.cn/embedded/160804.html

相关文章

申论 应用文 【2017副省第四题 “水生态+扶贫”】

材料: 近日,“秋水长天 水美中国”采访团调研了G市的水生态文明建设情况。记者经过走访发现,G市某些区县的“水生态扶贫”模式,对欠发达地区在保持青山绿水的同时大力推进脱贫工作,具有很强的借鉴意义。 G市以山地、…

关于知识蒸馏的概念原理以及常见方法

1. 概念与原理 知识蒸馏的基本定义 知识蒸馏(Knowledge Distillation) 是一种将模型压缩与迁移学习结合的技术:它利用预先训练好的大模型(通常参数量大、精度高、计算开销大)指导一个更轻量(参数量小、推理速度快)的学生模型进行训练,从而在保持模型精度的同时显著减少…

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取

AI 编程工具—Cursor 进阶篇 文章改写生成整理爬取 其实对做自媒体的人而言,整理素材其实是一件非常耗时的事情,今天我们来看一下如何使用Cursor来帮我们解决这些问题,首先我们要建一个单独的项目,因为这个项目不涉及任何代码操作,只是文字相关的事情,还有就是这个项目需…

高级java每日一道面试题-2025年01月30日-框架篇[SpringBoot篇]-如何理解 Spring Boot 配置加载顺序 ?

如果有遗漏,评论区告诉我进行补充 面试官: 如何理解 Spring Boot 配置加载顺序 ? 我回答: 在 Java 高级面试中讨论 Spring Boot 配置加载顺序时,理解其机制对于有效管理和调试应用程序配置至关重要。Spring Boot 通过一系列预定义的规则来确定如何加载和覆盖配置…

vscode和pycharm的区别

VSCode(Visual Studio Code)和 PyCharm 是两款常用的 Python 开发工具,它们在功能和使用体验上有一些关键区别: 1. 核心定位 VSCode:轻量级、多语言支持的代码编辑器,依靠插件扩展 Python 开发能力。PyCh…

【C语言】常量指针和指针常量,指针数组和数组指针,指针函数和函数指针怎么区分?

文章目录 1、常量指针和指针常量2、指针数组和数组指针3、指针函数和函数指针 1、常量指针和指针常量 int a 0; const int* p &a;//常量指针 int* const p1 &a;//指针常量常量指针:无法通过该指针修改指向地址中的内容。 指针常量:指针指向的…

瑞友天翼应用虚拟化系统 GetPwdPolicy SQL注入漏洞复现

免责声明 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在使…

神经网络(Neural Network)

引言 神经网络,作为人工智能和机器学习领域的核心组成部分,近年来在诸多领域取得了显著的进展。受生物神经系统的启发,神经网络通过模拟人脑神经元的工作机制,能够从大量数据中学习复杂的模式和关系。其强大的非线性建模能力使其在图像识别、自然语言处理、语音识别和预测…