状态模式(行为型)

news2024/11/26 16:27:15

目录

一、前言

二、状态模式

三、总结


一、前言

        状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为。对象看起来好像修改了它的类,但实际上,由于状态模式的引入,行为的变更被封装在了一系列独立的类中,这使得代码更加清晰、易于管理和扩展。

        状态模式由以下几个角色组成:

上下文(Context):定义客户端所感兴趣的接口,并保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
抽象状态(State):可以是一个接口或抽象类,用于定义声明状态更新的操作方法
具体状态(ConcreteState):实现抽象状态类定义的方法,根据具体的场景来指定对应状态改变后的代码实现逻辑

        整个状态模式的类图:

二、状态模式

        比如有一个台灯,只有一个开关,按第一次是开,第二次变成一档,第三次变成二档,第四次变成关,这种就是状态的变化,但触发是用的同一个按钮。

        先编写抽象状态类:

public abstract class State {
    public abstract void handle(Context context);
}

        环境类:

public class Context {
    private State state;

    public Context(){
        state = null;
    }

    public State getState() {
        return state;
    }

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

    public void handle(){
        state.handle(this);
    }
}

        具体状态A、B、C、D:

public class ConcreteStateA extends State{
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 开");
        context.setState(new ConcreteStateB());
    }
}


public class ConcreteStateB extends State{
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 一档");
        context.setState(new ConcreteStateC());
    }
}


public class ConcreteStateC extends State{
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 二档");
        context.setState(new ConcreteStateD());
    }
}


public class ConcreteStateD extends State{
    @Override
    public void handle(Context context) {
        System.out.println("当前状态是 关");
        context.setState(new ConcreteStateA());
    }
}

        再编写调用类进行测试:

public class StateClient {
    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new ConcreteStateA());
        context.handle();
        context.handle();
        context.handle();
        context.handle();

    }
}

        输出结果:

三、总结

        优点与缺点

优点:

1、封装了转换规则

2、枚举可能的状态,在枚举状态之前需要确定状态种类

3、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块

缺点:

1、状态模式的使用必然会增加系统类和对象的个数

2、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的代码

        使用场景

  • 行为会根据状态改变而改变
  • 含有大量条件判断的场景

        比如Hibernate使用状态模式管理对象的生命周期,Spring MVC的DispatcherServlet根据请求的URL来分发到不同的处理器(handler)。

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

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

相关文章

DOM对象(Document Object Model 文档对象模型)

目录 1、什么是DOM 1)是一个标准 2)是一个对象 2、原理及作用 3、Element元素的获取方法 4、方法使用举例 修改页面内容 1)获取DOM元素 2)修改元素内容 3)修改元素属性 4)添加和删除元素 5、应…

电脑硬盘分区表的两种格式:MBR 和 GPT

电脑硬盘分区表的两种格式:MBR 和 GPT 段子手168 2024-4-5 电脑硬盘分区表有两种格式:MBR 和 GPT: 一、MBR 分区表 1.MBR 是主引导记录 (Master Boot Record) 的英文缩写 在传统(Legacy)硬盘分区模式中&#xff0c…

春秋之境28512

题目说该CMS的/single.php路径下,id参数存在一个SQL注入漏洞。访问看一下随便点一个图片。 发现了注入点?id 那么开始查看闭合符一个 就报错了 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for th…

这些矛盾点不搞清楚,私域怎么做得起来!

最近不少人都在问,私域做不起来怎么办?有很多企业砸了不少钱,有些还做了好几年,依旧没有起色。 有些企业觉得私域做不起来的阻碍有运营方面的原因,比如文案写不好,社群不知道怎么管理;有团队方…

如何搭建企业级MQ消息集成平台

企业级MQ消息集成平台的重要性在于实现不同系统之间的高效、可靠、实时的消息传递和数据交换。它可以帮助企业实现系统解耦,提高系统的可扩展性和灵活性,降低系统间的依赖性。通过消息队列中间件,企业可以实现异步通信、削峰填谷、流量控制等…

华大单片机新建工程步骤

1.新建文件夹,比如00_LED 2.拷贝 hc32f460_ddl_Rev2.2.0\driver 到 00_LED 3.拷贝 hc32f460_ddl_Rev2.2.0\mcu\common 到 00_LED 4.拷贝 hc32f460_ddl_Rev2.2.0\example\ev_hc32f460_lqfp100_v2\gpio\gpio_output\source 到 00_LED 5.拷贝 hc32f460_ddl_Rev2.2.…

启明智显M系列--工业级HMI芯片选型表

本章主要介绍启明智显M系列HMI主控芯片: 纯国产自主, RISC-V 内核,配备强大的 2D 图形加速处理器、PNG/JPEG 解码引擎、H.264解码;工业宽温,提供全开源SDK;1秒快速开机启动的特性,极大地提高了…

初识Python(注释、编码规范、关键字...)

🥇作者简介:CSDN内容合伙人、新星计划第三季Python赛道Top1 🔥本文已收录于Python系列专栏: 零基础学Python 💬订阅专栏后可私信博主进入Python学习交流群,进群可领取Python视频教程以及Python相关电子书合…

网安小白常用五大靶场安装思路总结

网安小白常用五大靶场安装思路总结 一、安装 phpstudy二、查看服务器地址三、查看数据库的地址四、查看数据库用户的账号密码五、pikachu 靶场搭建六、DVWA 靶场搭建七、sqli-labs 靶场搭建八、uplod-labs 靶场九、xss-labs 靶场十、navicat 连接数据库 环境获取:获…

【Algorithms 4】算法(第4版)学习笔记 24 - 5.5 数据压缩

文章目录 前言参考目录学习笔记1:介绍2:游程编码 run-length encoding2.1:介绍2.2:Java 实现3:霍夫曼压缩 Huffman compression3.1:变长前缀码 variable-length codes3.1.1:介绍3.1.2&#xff1…

软文写作技巧,媒介盒子揭秘

数字化时代,想要获取用户的注意力难上加难,只有紧跟互联网的创作节奏,在软文写作中,根据用户的浏览偏好进行适当调整,让软文具有更高的审美性、易读性和启示性,才能有效地吸引当下受众的注意力。今天媒介盒子就来和大家聊聊软文写作技巧。 一、文章选题 …

OpenAI推出GPTBot网络爬虫:提升AI模型同时引发道德法律争议

文章目录 一、GPTBot 简介二、功能特点三、技术细节3.1、用户代理标识3.2、数据采集规则3.3、数据使用目的3.4、网站屏蔽方法3.5、数据过滤 四、GPTBot 的道德和法律问题五、GPTBot 的使用方法和限制六、总结 一、GPTBot 简介 OpenAI 推出的网络爬虫GPTBot旨在通过从互联网上收…

Todesstern:一款针对注入漏洞识别的强大变异器引擎

关于Todesstern Todesstern是一款功能强大的变异器引擎,该工具基于纯Python开发,该工具旨在辅助广大研究人员发现和识别未知类型的注入漏洞。 Todesstern翻译过来的意思是Death Star,即死亡之星,该工具是一个变异器引擎&#xff…

低代码平台适合谁用?业务岗能用它做什么?开发岗能用它做什么?一文讲清!

近期,低代码开发平台以其独特的魅力,迅速引发了大众的广泛关注。众多人士纷纷寻求了解各类低代码产品,以探究其功能与特点。 然而,有些人可能因一两款产品的体验不佳,便对整个低代码行业产生了偏见。但我要指出的是&am…

Latex写文章时,使用.bib方式添加参考文献方法,再也不用手动调整格式了

一、背景 使用Latex写文章时,有的模板添加参考文献是使用\begin{thebibliography}{99}和\end{thebibliography}方式,如下图所示,这样的话得手动添加参考文献。如果参考文献多的话特别麻烦,其中{99}指的是参考文献条目编号的最大宽…

提示词专场:从调整提示改善与LLMs的沟通,到利用LLMs优化提示效果

编者按:欢迎阅读“科研上新”栏目!“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里,你可以快速浏览研究院的亮点资讯,保持对前沿领域的敏锐嗅觉,同时也能找到先进实用的开源工具。 提示词的好坏决…

多个代理proxy配置——日志查看代理后的地址

一个项目接口有两个域名,需要配置两个代理复制一个axios封装文件,修改baseUrl为新的标识 ququ新接口文件引入新的request1即可 proxy: {// 新接口采用 /ququ前缀/ququ: {target: http://192.168.2.82:8888, //鑫哥 changeOrigin: true,logLevel: debug, …

SOLIDWORKS教育版使学生了解如何加快设计项目的速度

在当今信息爆炸的时代,设计项目的速度和效率对于工程专业的学生来说至关重要。SOLIDWORKS教育版作为一款专门为学生设计的3D CAD软件,不仅提供了强大的设计工具,更致力于帮助学生了解如何加快设计项目的速度,提升他们的设计能力和…

HarmonyOS 开发-应用新功能引导实现案例

介绍 本文介绍如何使用high_light_guide三方库完成应用新版本功能导航。通过高亮区域与蒙版背景的明暗度对比,让用户快速锁定重点功能,了解版本变更和业务入口。 效果图预览 使用说明 点击页面上对应按钮或空白区域进入下一个提示,直至提示…

CAXA电子图版2020版 下载地址及安装教程

CAXA电子图板是一款由国内软件公司CAXA开发的专业CAD(计算机辅助设计)软件。它主要用于绘制和编辑各种类型的二维图纸和工程图纸,广泛应用于建筑、机械、电气和电子等行业。 CAXA电子图板具有以下主要功能和特点: 二维绘图&…