状态模式:实现对象状态的封装和切换

news2025/1/10 20:39:48

状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为。该模式将对象的行为封装在不同的状态类中,使得对象可以根据其内部状态的改变而改变行为,从而实现了状态和行为的解耦。

结构和参与者

状态模式包含以下几个关键角色:

  • 上下文(Context):上下文是拥有状态的对象,它将状态的管理委托给当前状态对象。上下文可以通过调用状态对象的方法来改变当前状态,并在需要时将请求转发给状态对象。
  • 抽象状态(State):抽象状态定义了一个接口,用于封装与上下文相关的行为。它可以有多个实现类,每个实现类代表一个具体的状态。
  • 具体状态(Concrete State):具体状态是抽象状态的实现类,它实现了抽象状态定义的接口,并根据具体的状态来实现相应的行为。

工作原理

状态模式的核心思想是将对象的状态封装成独立的类,并将对象的行为委托给当前的状态对象。当对象的状态发生改变时,它会改变当前的状态对象,从而改变对象的行为。

 

下面是一个简单的示例,演示了状态模式的工作原理。

// 抽象状态类
interface State {
    void handle();
}

// 具体状态类A
class ConcreteStateA implements State {
    @Override
    public void handle() {
        System.out.println("当前状态为A");
    }
}

// 具体状态类B
class ConcreteStateB implements State {
    @Override
    public void handle() {
        System.out.println("当前状态为B");
    }
}

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

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

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

// 示例代码
public class StatePatternExample {
    public static void main(String[] args) {
        Context context = new Context();

        // 设置初始状态为A
        State stateA = new ConcreteStateA();
        context.setState(stateA);
        context.request(); // 输出:当前状态为A

        // 切换状态为B
        State stateB = new ConcreteStateB();
        context.setState(stateB);
        context.request(); // 输出:当前状态为B
    }
}

在上面的示例中,抽象状态接口State定义了一个handle()方法,具体状态类ConcreteStateAConcreteStateB分别实现了该接口,并根据具体的状态实现了不同的行为。

上下文类Context持有一个当前状态对象,并通过setState()方法来改变当前状态。request()方法会委托给当前状态对象的handle()方法来处理请求。

优点和适用场景

状态模式具有以下优点:

  • 封装性:状态模式将对象的状态封装成独立的类,使得状态的变化对于上下文对象来说是透明的,从而提高了代码的可维护性和可扩展性。
  • 灵活性:状态模式允许对象在不同的状态下具有不同的行为,而无需使用大量的条件语句。这样可以使得代码更加清晰、简洁,并且易于理解和修改。
  • 遵循开闭原则:通过新增状态类,可以方便地扩展和修改状态的行为,而无需修改上下文类的代码。

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

  • 当一个对象的行为取决于它的状态,并且它在运行时需要根据状态改变行为时,可以考虑使用状态模式。
  • 当一个对象需要根据不同的条件执行不同的操作时,可以考虑使用状态模式来封装这些条件和操作。
  • 当一个对象的状态转换规则比较复杂,并且状态之间的转换关系经常发生改变时,可以考虑使用状态模式来简化状态转换的代码。

总结起来,状态模式是一种有助于实现对象状态的封装和切换的设计模式。它通过将对象的状态封装成独立的类,并委托给当前的状态对象来实现状态和行为的解耦。状态模式可以提高代码的可维护性、可扩展性和灵活性,适用于需要根据对象的状态来改变行为的场景。

公众号请关注"果酱桑", 一起学习,一起进步!

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

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

相关文章

什么是RPC并实现一个简单的RPC

1. 基本的RPC模型 主要介绍RPC是什么,基本的RPC代码,RPC与REST的区别,gRPC的使用 1.1 基本概念 RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务本地过程调用&am…

【仲裁器】轮询仲裁round-robin,rr

起因:在多主单从的设计中,当多个源端同时发起传输请求时,需要仲裁器根据优先级来判断响应哪一个源端。轮询仲裁:各个源端优先级相同,当其同时发起请求时,依次进行响应。 电路图 代码 module rr_arb(input…

ACREL-5000能耗管理系统在某机场的应用 安科瑞 许敏

摘要:大型公共建筑总面积不足城镇建筑总面积的4%,但总能耗却占全国城镇总耗电量的22%,大型公共建筑单位面积年耗电量达到70~300KWh,为普通居民住宅的10~20倍。公共建筑是节能大户和节能重点,做好…

【HarmonyOS】ArkTS学习之基于TextTimer的简易计时器

【关键字】 ArkTS、计时器、TextTimer 【介绍】 TextTimer是ArkTS提供的通过文本显示计时信息并控制其计时器状态的组件。今天就给大家展示一个基于TextTimer的简易计时器的实现吧。在使用之前我们要先了解它的用法: TextTimer(options?: { isCountDown?: boolean…

【文末送书】Python深度学习(基于PyTorch)

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。搜…

FIR 滤波器去除噪声

目录 FIR 滤波器去除噪声 解决方案一:滑动平均滤波方法 解决方案二:另外一种理解角度-----引入权重系数概念 FIR滤波器表达式 FIR滤波器 一、FIR滤波器的基本结构 二、FIR滤波器的设计方法 1、频率采样法 2、窗函数法 三、FIR滤波器的性能指标 …

【2023,学点儿新Java-33】字符型变量char | 布尔类型变量 boolean:true、false

前情提要: 【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类【2023,学点儿新Java-31】测试:整型和浮点型变量的使用 | 附:计算机存…

(超详解)--->自定义类型(结构体,枚举,联合)

目录 本章学习重点: 1:结构体类型的声明与变量的定义 2:如何求解结构体的大小(结构体的内存对齐) 3:结构体传参,结构体实现位段 4:枚举类型的定义和优点 5:联合的定义与特点及大小的计算 1:结构…

Kind | Kubernetes in Docker 把k8s装进docker!

有点像杰克船长的黑珍珠 目录 零、说明 一、安装 安装 Docker 安装 kubectl 安装 kind 二、创建/切换/删除集群 创建 切换 删除 将镜像加载到 kind 群集中 零、说明 官网:kind Kind: Kubernetes in Docker 的简称。kind 是一个使用 Docker 容…

【技能实训】DMS数据挖掘项目-Day09

文章目录 任务9【任务9.1.1】升级DataBase类为可序列化的类,以便在文件保存或网络中传递【任务9.1.2】升级LogRec类为可序列化的类,以便在文件保存或网络中传递【任务9.1.3】升级MatchedLogRec类为可序列化的类,以便在文件保存或网络中传递【…

java通过正则表达式提取信息

java通过正则表达式提取信息 工具类如下 package com.datafactory.util;import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;import java.util.regex.Matcher; import java.util.regex.Pattern;Component Slf4j public class RegexUtils {/…

“简单易懂的排序:深入了解直接选择排序“

文章目录 🔍 选择排序的原理与过程📈 选择排序的优缺点👉 代码实现 🔍 选择排序的原理与过程 本文我们直接说一个优化过的直接选择排序。其思路大同小异. 选择排序的思路很简单 每次从待排序的数据中选择一个最小和最大的元素&a…

记一次rabbitmq消息发送成功,消费丢失问题

记一次rabbitmq消息发送成功,消费丢失问题 背景 测试数据归档,偶现数据未归档 排查 idea线上调试,log日志,数据库消息发送记录,代码分块重复执行看哪块出的问题,结果均无问题,最后使用rabbi…

网关选型对比

网关选型 网关简介 网关是将一个网络与另一个网络进行相互连通,提供特定应用的网络间设备,应用网关必须能实现相应的应用协议。应用网关可以看做是运行于要求特定业务的客户机与提供所需业务的服务器之间的中间过程。应用网关在这类过程中,从…

MySQL练习题(6)

创建两个表插入数据 CREATE DATABASE beifen;use beifen;CREATE TABLE books(bk_id INT NOT NULL PRIMARY KEY,bk_title VARCHAR(50) NOT NULL,copyright YEAR NOT NULL);INSERT INTO booksVALUES (11078, Learning MySQL, 2010),(11033, Study Html, 2011),(11035, How to u…

Linux—实操篇:组管理和权限管理

目录 1、Linux组基本介绍 2、文件/目录 所有者 2.1、查看文件所有者 2.1、修改文件的所有者 3、组的创建 4、文件/ 目录所在组 4.1、查看文件/目录所在组 4.2、修改文件/ 目录所在组 5、其他组 6、改变用户所在组 7、权限基本介绍 8、rwx权限详解 8.1、rwx作用到文…

除了单测、写main方法,还有其他验证方式吗?试试Java JShell吧!

文章首发地址 JShell 概述 Java JShell 是 JDK 9 中引入的一个交互式命令行工具,可以方便地测试 Java 代码片段和进行试验性的 Java 编程。JShell 可以帮助开发人员轻松地创建和测试 Java 代码,而无需编写和运行完整的应用程序或测试用例。以下是 JShe…

了解刚性、惯量、响应时间及伺服增益之间的关系,提高系统的性能和稳定性!

在伺服系统选型及调试中,刚性、惯量、响应时间及伺服增益调整之间的关系错综复杂,这些因素在控制系统中相互影响,对于系统的稳定性和性能至关重要。但在实践中如何调整取值比较合理,这些就算是工程师都会经常感到困惑。所以了解它…

Django 分布式路由

简介: Django中,主路由配置文件(urls.py)可以不处理用户具体路由,主路由的配置文件可以配置成做请求的分发(分布式请求处理,分发到子路由而不是具体的视图函数)。具体的请求可以由各自的应用来处理。 步骤…

stm32(SPI读写W25Q18)

SPI 是什么? SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总 线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PC…