java设计模式学习之【状态模式】

news2024/11/16 7:26:29

文章目录

  • 引言
  • 状态模式简介
    • 定义与用途
    • 实现方式
  • 使用场景
  • 优势与劣势
  • 在Spring框架中的应用
  • 状态示例
  • 代码地址

引言

设想你正在使用一个在线视频播放器观看电影。随着你的互动,播放器可能处于不同的状态:播放、暂停、缓冲或结束。每个状态下,播放器的行为和可用选项都不同。这种能够根据当前状态调整行为的能力对于创建直观、响应灵敏的应用至关重要。在软件开发中,状态模式正是用来优雅地处理这种依赖状态的行为变化的情况,它帮助设计者清晰地分离和管理对象在不同状态下的行为。

状态模式简介

定义与用途

状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象似乎修改了它的类。该模式封装了基于状态的行为,并且通过将每个状态实现为一个派生类的方式,将状态相关的行为局部化和集中化。

实现方式

实现状态模式通常涉及以下几个关键组件:

  • 上下文(Context):持有一个状态对象的引用,并允许外部客户端触发状态变化。
  • 状态(State):定义一个接口以封装与上下文的一个特定状态相关的行为。
  • 具体状态(Concrete States):实现状态接口的类,提供具体的行为实现。

使用场景

状态模式适用于以下场景:

  • 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变其行为时。
  • 当一个操作中含有庞大的多分支结构,并且这些分支依赖于对象的状态时。

例如:

  1. 文档审批流程:文档在创建、审批、发布等不同状态之间转换,每个状态下文档的行为(如编辑、审批、发布)不同。
  2. 交通信号灯:信号灯根据时间或条件变化其状态(红灯、绿灯、黄灯),每种状态下的行为(比如停车、行驶)也不同。
  3. 游戏中的角色状态:游戏角色可能有多种状态(正常、加速、减速、无敌等),每种状态下角色的行为和属性有所不同。

优势与劣势

  • 优势
    • 封装了基于状态的行为,并且将状态相关的行为局部化。
    • 通过消除庞大的条件分支语句,使得状态转换显式化。
  • 劣势
    • 如果状态多且复杂,会导致有很多状态类,增加系统复杂度。
    • 应用不当会导致状态和策略模式混淆。

在Spring框架中的应用

在Spring框架中,状态模式可能不会像某些其他模式那样直接被提及,但是其核心概念在某些Spring的功能和管理方式中得到了体现。以下是在Spring框架中体现状态模式概念的几个方面:

1. Spring状态机(Spring State Machine)
Spring状态机(Spring State Machine)是对状态模式概念的直接实现。它提供了一个强大的方式来管理状态转换以及状态下的行为。在复杂逻辑和工作流的情况下,如订单管理、配置管理等,Spring状态机可以帮助开发者以声明性的方式管理状态和事件。

2. Spring Web Flow
在Spring Web Flow中,状态模式的概念被用于管理Web应用中的页面流。页面流可以看作是一系列状态和发生在这些状态之间的事件。Spring Web Flow允许开发者定义页面流程的状态(如视图状态、决策状态等),并且基于发生的事件移动到不同的状态,从而提供丰富的用户界面导航。

3. Spring Security的认证状态
在Spring Security中,用户的认证状态(如已认证、未认证、认证失败等)可以被看作是用户在安全上下文中的状态。Spring Security使用一系列的过滤器和认证管理器来处理这些状态变化,并执行相应的安全逻辑。

4. Session和会话管理
在Spring MVC中,会话(Session)的状态管理也可以被看作是状态模式的一个例子。会话中的数据代表了用户的状态(如用户认证、选择的语言、配置偏好等),这些状态可能会随着用户的交互而改变。

状态示例

在这里插入图片描述
步骤 1:创建接口

public interface State {
   public void doAction(Context context);
}

State 接口定义了一个 doAction 方法,所有的具体状态类将实现这个接口,以提供相应的行为。

步骤 2:创建实现相同接口的具体类

public class StartState implements State {

   public void doAction(Context context) {
      System.out.println("播放器处于开始状态");
      context.setState(this);    
   }

   public String toString(){
      return "开始状态";
   }
}

StartState 是一个具体的状态类,表示开始状态。当播放器处于这个状态时,它将执行相应的操作并更新上下文状态。

public class StopState  implements State{

    @Override
    public void doAction(Context context) {
        System.out.println("播放器处于停止状态");
        context.setState(this);
    }

    @Override
    public String toString(){
        return "停止状态";
    }

}

StopState 是另一个具体的状态类,表示停止状态。在这个状态下,它将执行停止状态下的操作并更新上下文状态。

步骤 3:创建上下文类

public class Context {
   private State state;

   public Context(){
      state = null;
   }

   public void setState(State state){
      this.state = state;        
   }

   public State getState(){
      return state;
   }
}

Context 类持有一个状态对象的引用,并允许客户端通过 setState 方法改变其状态。它的行为随着状态的改变而改变。

步骤 4:使用上下文来看到状态改变时的行为变化

public class StatePatternDemo {
   public static void main(String[] args) {
      Context context = new Context();

      StartState startState = new StartState();
      startState.doAction(context);

      System.out.println("当前状态: " + context.getState().toString());

      StopState stopState = new StopState();
      stopState.doAction(context);

      System.out.println("当前状态: " + context.getState().toString());
   }
}

在这里插入图片描述

在这个演示类中,我们创建了一个上下文对象并改变其状态。首先,我们将上下文设置为开始状态并执行相关操作,然后我们将上下文设置为停止状态并执行相关操作。在每个状态改变后,我们都打印出当前的状态来看到行为的变化。

这个示例演示了状态模式如何使对象的行为随其状态的改变而改变。通过将每个状态的行为封装在单独的类中,我们可以很容易地增加新的状态和行为,同时保持不同状态的行为分离和独立。

代码地址

23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern

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

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

相关文章

IDEA安装教程及使用

一、IDEA简介 ​ IDEA全称IntelliJ IDEA,是用于Java语言开发的集成环境,它是业界公认的目前用于Java程序开发最好的工具。 集成环境:把代码编写,编译,执行,调试等多种功能综合到一起的开发工具。 二、ID…

数据分析之词云图绘制

试验任务概述:如下为所给CSDN博客信息表,分别汇总了ai, algo, big-data, blockchain, hardware, math, miniprog等7个标签的博客。对CSDN不同领域标签类别的博客内容进行词频统计,绘制词频统计图,并根据词频统计的结果绘制词云图。…

使用streampark进行flink on k8s LoadBalancer配置域名访问flink ui

在使用yarn部署flink任务时,yarn自动代理了flink web ui,通过yarn的地址即可访问任务web页面。 k8s模式下想访问flink web ui,要么使用NodePort的方式启动任务,然后通过k8s主机IPNodePort端口来进行访问。但是这种方法&#xff0…

C++构建简单静态库实例(cmakelist)

一、开发实例 通过cmake构建静态开发实例如下: 1.1 代码目录 代码目录结构如下: 1.2 代码内容 1.2.1 CMakeLists.txt # CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 项目名称 project(mylib)# 添加源文件 set(SOURCE_FILESsrc/mylib

分布式数据库 GaiaDB-X 通过 GB18030-2022《信息技术 中文编码字符集》最高级别认证

近日,百度智能云分布式数据库GaiaDB-X通过 GB18030-2022《信息技术 中文编码字符集》强制性国家标准测试,达到最高实现级别(3级)。 据了解,GB18030-2022《信息技术 中文编码字符集》是中文信息技术领域最重要的基础性标…

在 Unity 中获取 Object 对象的编辑器对象

有这个需求的原因是,在编辑器的 Inspector 逻辑中,写了许多生成逻辑。 现在不想挨个在 Inspector 上都点一遍按钮,所以就需要能获取到它们的编辑器对象。 发现可以借助官方的 UnityEditor.Editor.CreateEditor 方法达到目的,如下…

【IoT网络层】STM32 + ESP8266 +MQTT + 阿里云物联网平台 |开源,附资料|

目标:实现STM32连接阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266 ESP-01来连接网络,获取设备数据发送到阿里云物联网平台并显示且oled显示屏当前的设备数据,通过IOT studio界面…

OpenHarmony城市技术论坛武汉站:探索大模型时代的终端操作系统创新

2023年12月23日下午,OpenHarmony城市技术论坛(以下简称“技术论坛”)——第6期(武汉站)于华中科技大学梧桐语问学中心明德报告厅圆满举办。本次技术论坛聚焦“大模型时代的系统软件”,旨在探索AI大模型在终端操作系统领域的创新趋势和挑战。论坛从“终端操作系统十大技术挑战”…

亿赛通电子文档安全管理系统 linkfilterservice 未授权漏洞

产品简介 亿赛通电子文档安全管理系统,(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资…

php 之 redisk 扩展问题

系统: ARM V10 server (1229) 软件: php、phpdevel redis5.1.0RC1 redis5.1.0RC1.tgz phpredis 编译: 解压进入目录内: # phpize # ./configure withphpconfig/usr/bin/phpconfig # make # make ins…

【1】Docker详解与部署微服务实战

Docker 详解 Docker 简介 Docker 是一个开源的容器化平台,可以帮助开发者将应用程序和其依赖的环境打包成一个可移植、可部署的容器。Docker 的主要目标是通过容器化技术实现应用程序的快速部署、可移植性和可扩展性,从而简化应用程序的开发、测试和部…

机器学习——决策树(三)

【说明】文章内容来自《机器学习——基于sklearn》,用于学习记录。若有争议联系删除。 1、案例一 决策树用于是否赖床问题。 采用决策树进行分类,要经过数据采集、特征向量化、模型训练和决策树可视化4个步骤。 赖床数据链接:https://pan…

SLAM算法与工程实践——相机篇:RealSense D435使用(2)

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接,本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址: SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

基于ChatGpt,Java,SpringBoot,Vue,Milvus向量数据库的定制化聊天Web demo

customized chat GitHub - bigcyy/customized-chatgpt: 基于ChatGpt,Java,SpringBoot,Vue,Milvus向量数据库的定制化聊天Web demo 简介 基于ChatGpt,Java,SpringBoot,Vue,Milvus向…

基于SpringBoot+thymeleaf+layui 宠物医院预约管理系统(Java毕业设计有文档)

大家好,我是DeBug,很高兴你能来阅读!作为一名热爱编程的程序员,我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里,我将会结合实际项目经验,分享编程技巧、最佳实践以及解决问题的方法。无论你是…

1 - 数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型

数据库服务概述 | 构建MySQL服务 | 数据库基本管理 | MySQL基本类型 数据库服务概述构建mysql服务安装mysql软件包连接mysql服务器 修改密码 密码管理修改密码策略(需要登陆)破解数据库管理员root密码(数据库服务处于运行状态但是root忘记了密…

Android ImageView如何使用.svg格式图片

我们知道imageview常用的图片格式是.jpg/.png或者drawable里的部分.xml文件。但有时UI会给过来.svg格式的文件,下面讲解如何使用.svg格式图片文件 step1:AS点击File -> New -> Vector Asset step2:选中要使用的.svg文件,按需要命名和调整&#x…

信息泄露总结

文章目录 一、备份文件下载1.1 网站源码1.2 bak文件泄露1.3 vim缓存1.4 .DS_Store 二、Git泄露2.1 git知识点2.1 log2.2 stash 三、SVN泄露3.1 SVN简介3.2 SVN的文件3.3 SVN利用 四、Hg泄露 一、备份文件下载 1.1 网站源码 常见的网站源码备份文件后缀: tartar.gz…

中国首个车路云一体化研究中心成立,将如何改变自动驾驶?

图片|electronicsmedia.info ©⾃象限原创 作者丨钱诚 编辑丨程心 自动驾驶正在迎来一场新的变局。 只是这一次,搅动整个产业的,是各种政策的密集落地。 2023年10月,工信部提出要开展城市级“车路云一体化”示范&#x…

【机器学习】西瓜书第6章支持向量机课后习题6.1参考答案

【机器学习】西瓜书学习心得及课后习题参考答案—第6章支持向量机 1.试证明样本空间中任意点x到超平面(w,b)的距离为式(6.2)。 首先,直观解释二维空间内点到直线的距离: 由平面向量的有关知识,可得: 超平面的法向量为 w w w&am…