Java 设计模式-状态模式

news2024/9/22 23:39:00

目录

一. 概述

二. 主要角色

三. 代码示例

四. 优缺点

优点:

缺点:

五. 常见应用场景


一. 概述

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

        在状态模式中,我们创建表示各种状态的对象和一个行为随状态对象改变而改变的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. 定义状态接口的实现类
    package com.demo.status;
    
    /**
     * 文件名:HealthState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 健康状态下的行为:唱、跳、rap
     */
    public class HealthState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的健康练习生会:唱、跳、rap");
    
        }
    }
    
  3. 定义环境类(也就是上下文类)
    package com.demo.status;
    
    /**
     * 文件名:FractureState
     * 创建者:
     * 创建时间:2024-09-08
     * 描述:状态接口实现类
     * 骨折状态下的行为: 只能唱、rap
     */
    public class FractureState implements State{
        @Override
        public void action() {
            System.out.println("实习一坤年的骨折练习生只会:唱和rap");
        }
    }
    
  4. 测试类
    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();
    
        }
    }
    
  5. 测试结果

四. 优缺点

优点:

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

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

缺点:

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

五. 常见应用场景

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

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

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

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

相关文章

AES算法与接口解密

文章目录 AES算法基本介绍加密模式模式与IV 接口响应AES解密 AES算法 基本介绍 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法。 对称加密算法中加解密密钥都是一样的。 AES 的主要特性: 块加密:AES 是一种分组加密算法&…

Vue day-04

目录 一. vue组件 1.1 为什么用组件 1.2 vue组件 1.3 基础使用 1.4 全局 - 注册使用 1.5 局部 - 注册使用 1.4 用less写的样式 二. Vue组件之间传值(重点) 2.1 父组件向子组件传值 2.2 子组件向父组件传值 2.3 兄弟之间的传递 三. vue生命周期 3.1 含义 3.2 钩子…

phpmyadmin报错mysqli::real_connect(): (HY000/1045): Access denied for user ‘

问题分析 这是因为本身还安装了MySQL,导致发生冲突,只需要找到自己安装的进行关闭即可 方法 在任务管理器(快捷键:ctrlaltdelete)-服务中,找到对应的MySQL进行关闭

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级&…

数字化转型的战略规划应该怎么做?(附IBM-IT战略规划方法论PPT下载)

IBM-IT战略规划方法论PPT-下载链接见文末~ 数字化转型的战略规划是一个系统而复杂的过程,需要从多个维度进行考虑和规划。以下是一些关键步骤和建议,以帮助企业制定有效的数字化转型战略规划: 1. 明确数字化转型愿景和目标 设定愿景&#…

基于ONSEMI电源管理芯片NCP1607之AC300V高输入电压36W调色温智能电源

NCP1607PFC在LED智能电源PFC处理部分性价比高,输入电压范围宽到AC90-300V,母线电压420V导致高压低电流整机光效高,成熟芯片可靠新高,没有任何纹波与频闪,智能护眼。 ►场景应用图 ►产品实体图 ►展示板照片 ►方案方块图 ►核心…

常见概念 -- OPA与插损预置

OPA基本原理 OPA功能,即光功率调节(Optical Power Adjust),在新建光层业务时使用。 ​单板正常工作后,在网管上创建单站光交叉时,可以创建自动模式的光交叉,即启动OPA功能。OPA功能通过软件计算,自动调节交…

MACD指标精讲PART1:MACD指标入门及使用法则

一、MACD指标入门 MACD(Moving Average Convergence Divergence)指标称为指数平滑异同移动平均线指标,是由Geral Apple所创造,用来跟踪股价运行趋势、判断股票买卖时机的技术分析工具。 MACD指标由DIFF线(Difference线…

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJ…

SprinBoot+Vue体育商品推荐的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质…

无人机反制:便携式无人机反制盾技术详解

便携式无人机反制盾技术是一种先进的无人机防御手段,专门设计用于抵御或干扰无人机的活动。以下是对该技术的详细解析: 一、技术概述 便携式无人机反制盾是一种手持或单兵便携式设备,通过集成多种技术手段,实现对无人机的有效识…

【STM32项目】基于STM32+RTOS音频光通信设计与实现(完整工程资料源码)

基于STM32音频光通信设计与实现 目录: 目录 目录: 一、背景及意义: 二、国内外研究现状 2.1 国外研究的现状 2.1.1 国际可见光通讯联盟 2.1.2 日本的研究进展 2.1.3 德国的研究进展 2.1.4 英国的研究进展 2.1.5 美国的研究进展 2.2 国外研究…

【docker】docker network 网络

docker network 网络 Docker 为什么需要网络管理docker 网络架构简介CNMLibnetwork驱动 常见网络类型docker 网络管理命令 Docker 为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离, 但同时我们也要考虑下面的一些问题, 比如 多个容器…

Excel图表生成:自动化创建与修改Excel图表的技术指南

目录 引言 Excel图表基础 图表的作用与类型 Excel图表制作的基本步骤 自动化创建Excel图表 使用VBA宏自动化创建图表 自动化创建柱状图 自动化创建折线图 使用Python和第三方库自动化创建图表 安装必要的库 编写Python代码 修改Excel图表 修改图表类型和样式 自动…

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…

什么是COB超微小间距会议一体机?LED智能会议一体机重塑会议体验

在当今这个快节奏、高效率的时代&#xff0c;会议作为企业日常运营中不可或缺的一环&#xff0c;其效率与体验直接影响着企业的决策速度与团队协作能力。随着科技的飞速发展&#xff0c;传统的会议设备已难以满足现代会议室的多元化需求&#xff0c;LED智能会议一体机&#xff…

0基础跟德姆(dom)一起学AI Python进阶09-算法和数据结构

* 数据结构介绍 * 列表 * 链表 * 算法介绍 * 排序相关(冒泡, 插入, 选择, 快速排序) --- 1.数据结构和算法简介 * 程序 大白话翻译, **程序 数据结构 算法** * 数据结构 指的是 **存储, 组织数据的方式.** * 算法 指的是 **为了解决实际业务问题而思考 思路和方法…

气膜体育馆投资分析:未来体育设施的新方向—轻空间

随着全民健身运动的普及和城市化进程的加快&#xff0c;现代体育馆的需求日益增长。相较于传统建筑&#xff0c;气膜体育馆凭借其高性价比、快速搭建和灵活性&#xff0c;逐渐成为投资者关注的新型体育设施。从投资角度来看&#xff0c;气膜体育馆具备许多优势&#xff0c;能够…

IDEA怎么让控制台自动换行

IDEA怎么让控制台自动换行 操作流程 菜单>File>Settings>Editor>General>Console>勾选Use soft wraps in console 换行效果

广州市小学信息技术教案和课件

第一册 第二册 第三册 需要的加v