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

Java 设计模式-状态模式

目录

一. 概述

二. 主要角色

三. 代码示例

四. 优缺点

优点:

缺点:

五. 常见应用场景


一. 概述

        状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定的状态相关的行为放到一个类中,并且将请求委托给当前状态对象来执行。

        在状态模式中,我们创建表示各种状态的对象和一个行为随状态对象改变而改变的Context对象。

二. 主要角色

状态模式主要包含三个角色

  1. Context(上下文):维护一个指向当前状态对象的引用,这个引用指向的状态对象定义了在特定时间对象将如何响应请求。

  2. State(状态接口):定义一个接口,以封装与Context的某个状态相关的行为。

  3. Concrete State(具体状态):实现State接口,并且包含与特定状态相关的行为。

三. 代码示例

以啊坤身体状态为例(健康和骨折的阿坤):

1. 健康的阿坤:会唱、跳、rap。

2. 骨折的阿坤:唱、rap。

代码示例:

  1. 定义状态接口
    package com.demo.status;/*** 文件名:State* 创建者:* 创建时间:2024-09-08* 描述:定义状态接口*/
    public interface State {//定义行为方法void action();
    }
    
  2. 定义状态接口的实现类1(健康的阿坤)
    package com.demo.status;/*** 文件名:HealthState* 创建者:* 创建时间:2024-09-08* 描述:状态接口实现类* 健康状态下的行为:唱、跳、rap*/
    public class HealthState implements State{@Overridepublic void action() {System.out.println("实习一坤年的健康练习生会:唱、跳、rap");}
    }
    
  3. 定义状态接口的实现类2(骨折的阿坤)
    package com.demo.status;/*** 文件名:FractureState* 创建者:* 创建时间:2024-09-08* 描述:状态接口实现类* 骨折状态下的行为: 只能唱、rap*/
    public class FractureState implements State{@Overridepublic void action() {System.out.println("实习一坤年的骨折练习生只会:唱和rap");}
    }
    
  4. 定义环境类(也就是上下文类)
    package com.demo.status;/*** 文件名:Context* 创建者:* 创建时间:2024-09-08* 描述:环境类*/
    public class Context {//持有状态接口的引用private State state;public Context(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.action(); // 委托给当前状态处理请求}
    }
    
  5. 测试类
    package com.demo.status;/*** 文件名:Main* 创建者:* 创建时间:2024-09-08* 描述:测试类*/
    public class Main {public static void main(String[] args) {//创建实现类对象(健康的啊坤)HealthState healthState = new HealthState();//创建实现类对象(骨折的啊坤)FractureState fractureState = new FractureState();//通过给环境传入不同的对象,执行不同的方法(传入一个健康的阿坤)Context healthContext = new Context(healthState);healthContext.request();//通过给环境传入不同的对象,执行不同的方法(传入一个骨折的阿坤)Context fractureContext = new Context(fractureState);fractureContext.request();}
    }
    
  6. 测试结果

四. 优缺点

  • 优点:

封装性好:将状态转换逻辑封装在状态类中,减少了Context类的复杂性。
扩展性好:可以方便地添加新的状态类,满足开闭原则。
状态转换清晰:状态转换逻辑明确,易于理解和维护。

避免庞大的条件分支语句:避免了在上下文类中使用大量的条件分支语句来根据状态改变行为。

  • 缺点:

增加系统复杂性:随着状态的增多,类的数量也会增多,可能导致系统变得复杂。
可能增加系统开销:每个状态都是一个对象,可能会增加内存开销。

五. 常见应用场景

状态模式常用于处理对象多种状态转换的情况如:

  1. 订单状态管理:待支付、已支付、已发货、已完成等状态转换。
  2. 工作流引擎:任务的不同执行阶段(如待处理、处理中、已完成)。
  3. 网络连接状态:连接中、已连接、断开连接等。
  4. UI组件的交互状态:如按钮的可用/禁用状态。

相关文章:

Java 设计模式-状态模式

目录 一. 概述 二. 主要角色 三. 代码示例 四. 优缺点 优点: 缺点: 五. 常见应用场景 一. 概述 状态模式是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式把所有的与一个特定…...

2024.9.13 Python与图像处理新国大EE5731课程大作业,索贝尔算子计算边缘,高斯核模糊边缘,Haar小波计算边缘

1.编写一个图像二维卷积程序。它应该能够处理任何灰度输入图像,并使用以下内核进行操作: %matplotlib inline import numpy as np import matplotlib.pyplot as plt from scipy import linalg import random as rm import math import cv2# import and …...

动态IP池的IP都是纯净IP吗?

在当今互联网时代,动态IP池作为一种网络资源管理策略,被广泛应用于数据抓取、市场调研、广告验证等多种场景中。动态IP池能够提供大量可轮换的IP地址,以帮助用户避免因频繁访问同一网站而被封禁IP的情况。然而,一个关键的问题是&a…...

【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)

一、SQL查询重复的数据: 1、SQL格式: Select * From 数据表 Where 重复记录字段 in ( select 重复记录字段 From 数据表 Group By 重复记录字段 Having Count(重复记录字段)>1) 2、举例: 在这个patient_member_info表中,我们…...

计算机操作系统之并行性与并发性笔记

目录 在计算机操作系统中,并行性与并发性是两个既相似又有区别的重要概念 并行性: 并发性: 可以通过多任务处理和资源共享来具体说明 并发性的例子 并行性的例子 总结 在计算机操作系统中,并行性与并发性是两个既相似又有区别…...

顶级高效的ChatGPT论文润色提示词和使用技巧

在学术研究中,精确和高效地对文本进行润色和修改是一个必不可少的重要环节。随着学术论文篇幅的增长和内容的复杂度上升,找到一种能够有效整理和优化修改内容的方法变得尤为关键。本文将探讨如何利用ChatGPT作为工具,通过具体的指令和策略,来优化文本的修改过程,提高学术写…...

WebAPI (一)DOM树、DOM对象,操作元素样式(style className,classList)。表单元素属性。自定义属性。间歇函数定时器

文章目录 Web API基本认知一、 变量声明二、 DOM1. DOM 树2. DOM对象3. 获取DOM对象(1)、选择匹配的第一个元素(2)、选择匹配多个元素 三、 操作元素1. 操作元素内容2. 操作元素属性(1)、常用属性(href之类的)(2)、通过style属性操作CSS(3)、通过类名(cl…...

若依框架开发

若依环境 介绍 ‌若依是一款快速开发平台(低代码),用于快速构建企业级后台管理系统,它提供了许多常用的功能模块和组件,包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ ‌基于Spring Boot和Spring Cloud‌…...

局域网windows下使用Git

windows下如何使用局域网进行git部署 准备工作第一步 ,ip设置设置远程电脑的ip设置,如果不会设置请点击[这里](https://blog.csdn.net/Black_Friend/article/details/142170705?spm1001.2014.3001.5501)设置本地电脑的ip:验证 第二步&#x…...

Redis访问工具

使用Redis存储缓存数据,如何通过Java去访问Redis? 防止后面看晕,先来张图。 1. Redis的客户端库 Redis的客户端库是Redis官方提供的,用于让Java等编程语言与Redis服务器进行通信的工具包。常见的Redis客户端库有多个&#xff0c…...

vue3+ant design vue动态实现级联菜单~

1、这里使用的是ant design vue 的TreeSelect 树选择来实现的。 <a-form-item name"staffDept" label"责任部门" labelAlign"left"><a-tree-selectv-model:value"formState.staffDept"show-search//允许在下拉框中添加搜索框…...

软件可维护性因素例题

答案&#xff1a;C 知识点&#xff1a; 系统可维护性因素决定 可理解性 可测试性 可修改性 选项C可移植性错误...

git的一些操作

参考视频: git分支详解&#xff08;约10分钟掌握分支80%操作&#xff09;&#xff0c;git-branch&#xff0c;git分支管理&#xff0c;git分支操作&#xff0c;git分支基础和操作&#xff0c;2023年git基础使用教程 不同的分支相当于不同的平行世界 合并分支 两个分支是我们项…...

opencv实战项目二十三:基于BEBLID描述符的特征点匹配实现表盘校正

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、特征点匹配介绍二、特征点检测三、特征描述符计算四&#xff0c;描述符的匹配筛选五&#xff0c;根据匹配结果映射图片六&#xff0c;整体代码&#xff1a;…...

数据库是全表扫描是怎么扫描法?

全表扫描是数据库服务器用来搜寻表的每一条记录的过程&#xff0c;直到所有符合给定条件的记录返回为止。‌ 在执行全表扫描时&#xff0c;数据库会逐行扫描表中的所有记录&#xff0c;以找到符合查询条件的记录。这种扫描方式适用于没有为查询条件中的字段建立索引的情况。全…...

认准这10款人力资源系统,90%的企业都在用!

本文将为大家推荐十款主流的人力资源系统&#xff0c;为企业选型提供参考&#xff01; 想象一下&#xff0c;企业在不断发展壮大的过程中&#xff0c;员工数量逐渐增多&#xff0c;人事管理变得越来越复杂。如果没有一个高效的人力资源系统&#xff0c;就如同在大海中航行却没有…...

2024年我的利基出版转型——新战略与重点解析

这篇文章酝酿已久。这是我在网络出版策略上投入数百小时后得出的成果。 像我们这个行业的许多人一样&#xff0c;即网络出版行业&#xff0c;我一直忙于彻底改造整个出版业务。 这是一段漫长的旅程&#xff0c;这是肯定的。 我预感在此过程中还会有更多调整&#xff0c;但我…...

【数据结构】双向链表专题

目录 1.双向链表的结构 2.双向链表的实现 2.1初始化 以参数的形式初始化链表&#xff1a; 以返回值的形式初始化链表&#xff1a; 2.2尾插 2.3打印 2.4头插 2.5尾删 2.6头删 2.7查找 2.8在指定位置之后插入数据​编辑 2.9删除pos节点 2.10销毁 3.整理代码 3.1…...

大二上学期计划安排

大二上学期计划安排 学期目标: 加强算法学习,提升算法思维,为以后的算法竞赛做准备学习java知识,学习框架,构建知识体系,深入底层,增强理解增加项目经验,独立完成至少一个项目,并进行交流,优化增强团队凝聚力,营造良好的团队氛围阅读书籍,阅读至少3本以上经典书籍 日常学习安…...

HarmonyOS开发实战( Beta5.0)图片编辑实现马赛克效果详解

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例将原图手指划过的区域分割成若干个大小一致的小方格…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...