设计模式-状态模式使用方法

状态模式(State Pattern)是一种行为设计模式,它允许一个对象在其内部状态改变时改变它的行为,看起来就好像改变了它的类一样。状态模式主要用于实现一个对象的状态转换逻辑分离,以及避免使用大量的条件判断语句。

状态模式通常涉及以下几个角色:

  1. 上下文(Context):它定义了客户端需要的接口,并持有一个状态对象的引用,用以表示当前状态。
  2. 状态(State):它是一个抽象接口或基类,定义了每个状态应有的方法。
  3. 具体状态(Concrete States):这些类实现状态接口或继承状态基类,提供各自状态下的具体行为实现。

实现状态模式

实现状态模式的关键是将状态的行为封装在各自的具体状态类中,并通过上下文类来管理状态间的转换。

下面是如何在 Java 中实现状态模式的一个例子:

首先,定义状态接口:

1public interface State {
2    void handle(Context context);
3}

接着,创建具体状态类实现状态接口:

1public class ConcreteStateA implements State {
2    @Override
3    public void handle(Context context) {
4        System.out.println("Handling state A logic...");
5
6        // Switch to state B
7        context.setState(new ConcreteStateB());
8    }
9}
10
11public class ConcreteStateB implements State {
12    @Override
13    public void handle(Context context) {
14        System.out.println("Handling state B logic...");
15
16        // Switch to state A
17        context.setState(new ConcreteStateA());
18    }
19}

然后,实现上下文类,它将根据当前状态委托调用具体状态的行为:

1public class Context {
2    private State state;
3
4    public Context(State state) {
5        this.state = state;
6    }
7
8    public void setState(State state) {
9        this.state = state;
10    }
11
12    public void request() {
13        state.handle(this);
14    }
15}

最后,展示如何使用这些类:

1public class Main {
2    public static void main(String[] args) {
3        Context context = new Context(new ConcreteStateA());
4
5        // The client code calls 'request()', which delegates to the current state's 'handle()' method
6        context.request(); // Outputs: Handling state A logic...
7        context.request(); // Outputs: Handling state B logic...
8        context.request(); // Outputs: Handling state A logic...
9        // And so on...
10    }
11}

在上面的例子中,Context 类持有一个 State 类型的引用,代表当前状态。ConcreteStateA 和 ConcreteStateB 是具体的状态实现,它们知道如何处理自己的状态逻辑,并知道在何时转换到另一个状态。通过调用 context.request(),客户代码触发状态的处理逻辑,而不需要知道当前是哪个状态。

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

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

相关文章

C# LINQ基础

LINQ基础 1. 入门2. 运算符流语法2.1 连续使用查询运算符2.2 使用Lambda表达式2.2.1 Lambda表达式及Func的方法签名2.2.2 Lambda表达式和元素类型2.2.3 自然排序2.2.4 其他查询运算符 3 查询表达式4 延迟执行4.1 重复执行4.2 捕获的变量4.3 延迟加载的工作原理4.4 查询语句的执…

【思考】crud接口命名规范

写代码时取名字真的是痛苦。 方法命名 1、阿里命名规范 Service/Dao 层命名规约 1) 获取单个对象的方法用 get 做前缀。 2) 获取多个对象的方法用 list 做前缀。 3) 获取统计值的方法用 count 做前缀。 4) 插入的方法用 save&am…

c++ 11 新特性 不同数据类型之间转换函数之const_cast

一.不同数据类型之间转换函数const_cast介绍 const_cast是C11中引入的一种类型转换操作符,用于修改类型的const或volatile属性。const_cast的主要用途是移除对象的常量性,它是唯一具有此能力的C风格的转型操作符。在C11中,const_cast可以完成…

李子柒的精致生活只是一种文人想象

社会运行有两种基本的赚钱方式:1.做出有意义的社会贡献,获得与贡献的社会价值相称的报酬。劳动时间与劳动价值同酬。2.利用市场的无效率,在不产生任何实质价值的情况下摘取资金。劳动时间与劳动价值不同酬。 找一份工作、从事有用的工作、编…

【经验】测试工装排错小结

最近在整产品测试工装,看起来很简单的几项检测功能,前后也就几百行代码,但是却花了两周时间将功能调试出来,过程可谓一波三折,现总结如下。 1:对于电源控制类的检测,最好考虑下电平稳定时间。 …

SpringMVC拦截器和过滤器执行顺序及区别

拦截器(Inteceptor)和过滤器(Filter)执行顺序? 拦截器和过滤器区别? 1、拦截次数不同: 过滤器:一次请求只能被一个过滤器拦截一次,它们按照在web.xml中的声明顺序依次执…

RBAC详细解释

关于RBAC **RBAC** **R**ole **B**ased **A**ccess **C**ontrol(基于角色的访问控制) RBAC是经典的用户权限管理的设计思路。在这样的设计中,会存在3种类型:用户、角色、权限,权限将分配到各种角色上,用户…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑净负荷均衡的分布式光伏集群电压调控策略研究》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

遗传算法理解与代码实战(二)- demo(python+deap)

前文介绍了遗传算法,并且手动python代码进行了实践,但是在遇到复杂的问题时(遗传算法理解与代码实战(三)会介绍),手写代码很麻烦,所以需要借助专门的遗传算法库来实现,这…

使用IAD电话交换机(语音网关)将电话外线对接到FreeSWITCH SIP服务器

在我们初步了解了FreeSWITCH这样的SIP服务器之后,常见的一个需求就是把真实的电信世界(比如固话、手机)对接到SIP服务器里。 今天我们就介绍一个简单的方法,在3分钟内就把电信局和你的SIP软交换机融合通信起来。 IAD和SIP服务器环…

Superset二次开发之Superset架构理解

技术框架 框架作用 前端 React构建用户界面的 JavaScript 库ReduxJavaScript 应用的状态管理库,管理组件间的状态共享Webpack前端资源打包工具BabelJavaScript 编译器D3.js数据可视化的 JavaScript 库后端 Flask轻量级的 Python web 框架,处理 HTTP 请求、路由以及其他 Web 服…

搜维尔科技:动作捕捉与数字时尚:Wondar Studios欧莱雅项目

来自意大利的Wondar Studios工作室,是一家制作与动作捕捉技术相关软件和内容的公司,其出品的三维角色动画均由专业动捕系统真实录制制作。 我们很高兴与大家分享Wondar Studios最新的动捕项目,该项目带来了身临其境的虚拟现实体验。他们与巴…

AI新工具 MacOS 翻译提供翻译、润色和语法修改功能的插件;AI生成 Excel公式;Deepmind前华人员工创建视频生成工具

1: OpenAI Translator Bob Plugin macOS 平台的翻译提供翻译、润色和语法修改功能的插件 OpenAI Translator Bob Plugin是一款基于OpenAI的API,为用户提供翻译、润色和语法修改功能的插件。这款插件专门为macOS平台上的Bob软件设计,通过使用先进的Chat…

fork属性的作用

在Maven中,fork属性是maven-compiler-plugin插件的一个配置选项。它的作用是控制是否为编译过程启动一个新的进程。当fork设置为true时,Maven将启动一个新的进程来执行编译,这允许你在本地的Java编译器之外使用其他Java编译器,例如…

矩阵键盘中为什么有键位并联二极管?

矩阵键盘上使用二极管主要是为了解决“幽灵键”(Ghosting)和“键盘冲突”(Key Jamming)问题,这两种现象在没有采取适当措施的矩阵键盘中很常见。 幽灵键现象 当用户在矩阵键盘上同时按下多个键时,由于电流…

笔试刷题记录(二)

数值操作类型转换 class CompareReference{public static void main(String [] args){float f42.0f;float f1[]new float[2];float f2[]new float[2];float[] f3f1;long x42;f1[0]42.0f;} }A f1f2 B xf1[0] C f1f3 D f2f1[1]BC正确,选项B解释,java核…

如何定义resultType和resultMap,它们之间的区别是什么?解释一下<parameterType>的作用和用法。

在MyBatis中,resultType和resultMap都用于将数据库查询结果映射到Java对象,但它们在使用方式和灵活性上有一些区别。 resultType resultType是一个简单的类型别名,它用于指定查询结果应该映射到的Java类型。当数据库表中的列名和Java对象的属…

设计模式-建造者模式实践案例

建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。当一个对象需要多个部分或许多步骤来创建,并且需要将创建过程与表示分离时,建造者模式非常有用。建造者模式旨在找到一个解决方案&…

C#使用泛型自定义的方法设计队列CQueue<T>类

目录 一、涉及到的知识点 1.C#中的队列类 2.自定义队列的方法 &#xff08;1&#xff09;先设计一个CList<T>类 &#xff08;2&#xff09;再设计CQueue<T>类 二、自定义队列CQueue<T>类的实例 一、涉及到的知识点 1.C#中的队列类 在C#中实现队列类&a…

数据仓库实战 第一讲

第一节 数据仓库的定义 数据仓库的优势 面向主题集成相对稳定反映历史变化 数据仓库的架构 特点 简单通过暂存区简化数据准备星型结构沙盒 &#xff08;提供专用安全区域&#xff09; 云数据仓库 特点 弹性&#xff08;高扩展性能&#xff09;简单易用易于管理节约成本…