【设计模式-状态模式】

news2024/9/28 14:58:03

定义

状态模式(State Pattern)是一种行为型设计模式,允许对象在其内部状态改变时改变其行为。该模式将状态的变化封装在状态对象中,从而使得对象的行为随着状态的变化而变化。

UML图

在这里插入图片描述
角色

  • Context(上下文):持有一个当前状态的引用,并提供一个方法来改变状态。
  • State(状态接口):定义一个接口,用于在不同状态下执行的行为。
  • ConcreteState(具体状态):实现状态接口,定义在此状态下具体的行为。

代码

// 状态接口
interface State {
    void handle(Context context);
}

// 上下文类
class Context {
    private State currentState;

    public Context(State initialState) {
        currentState = initialState;
    }

    public void setState(State state) {
        currentState = state;
    }

    public void request() {
        currentState.handle(this);
    }
}

// 具体状态 A
class ConcreteStateA implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling request in State A.");
        context.setState(new ConcreteStateB()); // 切换到状态 B
    }
}

// 具体状态 B
class ConcreteStateB implements State {
    @Override
    public void handle(Context context) {
        System.out.println("Handling request in State B.");
        context.setState(new ConcreteStateA()); // 切换到状态 A
    }
}

// 测试状态模式
public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());

        context.request(); // 输出: Handling request in State A.
        context.request(); // 输出: Handling request in State B.
        context.request(); // 输出: Handling request in State A.
    }
}

优点

  • 简化代码:将与状态相关的行为封装在状态类中,减少了条件语句的复杂性。
  • 状态易扩展:添加新状态时,只需增加新的状态类,而不需要修改已有的代码。
  • 单一职责原则:每个状态的行为独立,符合单一职责原则。

缺点

  • 状态类数量增多:每个状态都需要一个类,可能导致类数量增加,增加管理难度。
  • 上下文与状态紧密耦合:上下文和状态之间的耦合较强,可能影响系统的灵活性。

适用场景

  • 对象行为变化:如一个订单状态(待付款、已付款、已发货、已完成)在不同状态下的行为不同。
  • 有限状态机:如游戏中的角色状态(静止、移动、攻击)。
  • 工作流管理:如审批流程中各个状态之间的转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2173856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用scroll-behavior属性实现页面平滑滚动的几个问题

在较长的页面中,为了便于用户浏览,开发人员经常会使用锚点链接,锚点链接默认的效果是瞬间跳转,为了让用户体验更好,往往会添加滚动效果。我记得要实现滚动效果,以前一般是结合一段JavaScript代码来实现。 后…

CSS04-Chrome调试工具

Chrome 浏览器提供了一个非常好用的调试工具,可以用来调试我们的 HTML结构和 CSS 样式。

万户OA-ezOFFICE fileUpload.controller 任意文件上传漏洞复现

0x01 产品描述: 万户OA(Office Automation)是一款企业级协同办公管理软件,旨在为企业提供全面的办公自动化解决方案。万户ezOFFICE存在任意文件上传漏洞。攻击者可以通过该远程下载任意文件到目标服务器,导致攻击者可获…

生信初学者教程(十四):差异结果的火山图

文章目录 介绍加载R包导入数据画图函数火山图输出结果总结介绍 火山图(Volcano Plot)是一种用于展示基因差异表达分析结果的二维散点图。它通过同时展示统计显著性和变化幅度,帮助研究者识别出在不同条件下显著差异表达的基因。火山图的横轴通常表示基因表达变化的倍数对数(…

第 18 章 从猫爷借钱说起——事务简介

18.1 事务的起源 CREATE TABLE account ( id INT NOT NULL AUTO_INCREMENT COMMENT 自增id, name VARCHAR(100) COMMENT 客户名称, balance INT COMMENT 余额, PRIMARY KEY (id) ) EngineInnoDB CHARSETutf8;insert into account (name, balance) values (狗哥, 11), (猫爷, 2…

VS开发C++项目常用基础属性配置

这篇文件简单讨论一下visual studio中项目属性的常用基础配置。 1.输出目录:项目目标文件生成位置。 2.中间目录:项目生成的中间文件所在的位置。 3.目标文件名:项目生成目标文件名称。 4.附加包含目录:三方库等头文件所在的位…

图新说 注册机使用 功能介绍

图新说简介 1. 什么是图新说? 图新说是一款技术自主可控的国产三维BIMGIS数字化方案汇报、成果交付平台。主要解决汇报方案的精准还原、方案展示、方案汇报及成果交付问题。 将影像、实景三维等周边现状数据与设计成果完美融合将设计方案二三维一体化表达流畅讲解设…

用Promise实现前端并发请求

/** * 构造假请求 */ async function request(url) {return new Promise((resolve) > {setTimeout(() > {resolve(url);},// Math.random() * 500 800,1000,);}); }请求一次,查看耗时,预计应该是1s: async function requestOnce() {c…

vue 项目打包更新后,界面未刷新时js与css资源加载404,监听资源文件404后自动重新加载页面。

问题 vue 项目打包更新(生成环境)后,界面未刷新时js与css资源加载404,如图: 期望 希望可以监听到资源文件加载404时,刷新界面,解决打包后由于文件名的变化导致点击旧页面时 JS 和 CSS 文件出…

Spring MVC常用注解(绝对经典)

文章目录 一、元注解1.1 Target:1.2 Retention: 二、常见注解2.1 Controller:2.2 SpringBootApplication:2.3 RequestMapping:2.4 RequestParam:2.5 PathVariable:2.6 RequestPart:2…

OpenCV 形态学相关函数详解及用法示例

OpenCV形态学相关的运算包含腐蚀(MORPH_ERODE),膨胀(MORPH_DILATE),开运算(MORPH_OPEN),闭运算(MORPH_CLOSE),梯度运算(MORPH_GRADIENT),顶帽运算(MORPH_TOPHAT),黑帽运算(MORPH_BLACKHAT),击中…

『网络游戏』GoLand服务器框架【01】

打开GoLand创建项目 编写Go程序:main.go package mainimport ("fmt""newgame/game/gate""os""os/signal""syscall""time" )var (SinChan make(chan os.Signal, 1)closeChan chan struct{} )func ma…

【JavaEE】——线程池大总结

阿华代码,不是逆风,就是我疯, 你们的点赞收藏是我前进最大的动力!!希望本文内容能够帮助到你! 目录 引入:问题引入 一:解决方案 1:方案一——协程/纤程 (1…

SwiftUI简明概念(3):Path.addArc的clockwise方向问题

一、画个下半圆 SwiftUI中绘制下半圆的一个方法是使用Path.addArc,示例代码如下: var body: some View {Path { path inpath.addArc(center: CGPoint(x: 200, y: 370), radius: 50, startAngle: Angle(degrees: 0), endAngle: Angle(degrees: 180.0), …

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明

谷歌发布Imagen 3,超过SD3、DALL・E-3,谷歌发布新RL方法,性能提升巨大,o1模型已证明。 谷歌DeepMind发布了全新文生图模型Imagen 3,在文本语义还原、色彩搭配、文本嵌入、图像细节、光影效果等方面相比第二代大幅度提升…

2024新版IDEA创建JSP项目

1. 创建项目 依次点击file->new->Project 配置如下信息并点击create创建项目 2. 配置Web项目 点击file->Project Structure 在点击Project Settings->Module右键右边模块名称->ADD->Web 点击Create Artifact 出现如下界面就表示配置完毕,…

3.整数二分

模板 package base;public class Bsearch {public int binary_search1(int l, int r){while (l<r){int mid (lr1)>>1;if(check(mid)) lmid;else r mid-1;}return l;}public int binary_search2(int l, int r){while (l<r){int mid (lr)>>1;if (check(mid…

Python酷库之旅-第三方库Pandas(129)

目录 一、用法精讲 576、pandas.DataFrame.merge方法 576-1、语法 576-2、参数 576-3、功能 576-4、返回值 576-5、说明 576-6、用法 576-6-1、数据准备 576-6-2、代码示例 576-6-3、结果输出 577、pandas.DataFrame.update方法 577-1、语法 577-2、参数 577-3、…

实操了 AI 大模型项目落地, 程序员成功转变为 AI 大模型工程师

根据《2024 年全球人工智能行业报告》最新的数据显示&#xff0c;全球 AI 市场预计将以每年超过 40% 的速度增长&#xff0c;到 2030 年市值将达到数万亿美元&#xff0c;这也是预示着在接下来的十年到十五年里&#xff0c;人工智能将获得巨大的发展红利。 在过去的一年多时间…

如何配置flutter(超详细的哦)

目录 首先先去官网下载zip包 下载下来之后就是解压 配置环境变量 winr查看是否配置成功 解决报错 [!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)X cmdline-tools component is missing Android license status unknown 首先先去官…