【重温设计模式】状态模式及其Java示例

状态模式的基本概念

在编程世界的大海中,各种设计模式就如同灯塔,为我们的代码编写指明方向。其中,状态模式是一种行为设计模式,它让你能在一个对象的内部状态改变时改变其行为,使得对象看起来就像改变了其类一样。这个模式的名字,仿佛是在告诉我们,它就像一个小船,在程序设计的海洋中,根据风向(状态)改变航向(行为)。

状态模式在面向对象设计中的重要性不言而喻,它是我们处理复杂对象状态转换,减少条件语句,使代码更加清晰和易于维护的重要工具。

public class OneMore {private State state;public OneMore(State state) {this.state = state;}public void setState(State state) {this.state = state;}public void request() {state.handle(this);}
}

在这段简单的Java代码中,我们定义了一个名为OneMore的类,这个类有一个状态(State)属性,通过改变这个状态,OneMore的行为也会随之改变。这就是状态模式的基本概念和应用。不过,要想深入理解和灵活运用状态模式,我们还需要了解其内部的结构和组成。

状态模式的结构和组成

在了解了状态模式的基本概念之后,我们来深入探讨一下它的结构和组成。状态模式主要由三个部分组成:上下文(Context)、抽象状态(Abstract State)和具体状态(Concrete State)。

首先,我们来看一下上下文。上下文是一个定义客户端所感兴趣的接口,并且维护一个具体状态类的实例,这个实例定义了当前的状态。上下文可以对外提供一种接口,用于改变它的状态。

然后,我们来看看抽象状态。抽象状态定义了一个接口,用于封装与上下文的一个特定状态相关的行为。在抽象状态中,我们可以定义一些方法,这些方法可以被不同的具体状态所重写,以实现不同状态下的行为。

最后,我们来看看具体状态。具体状态是抽象状态的子类,每一个子类实现了一个与上下文的状态相关的行为。在具体状态中,我们可以实现抽象状态中定义的方法,以实现不同状态下的行为。

下面是一个简单的Java代码示例,用于展示状态模式的结构和组成:

class Context {private AbstractState state;public void setState(AbstractState state) {this.state = state;}public void request() {state.handle(this);}
}abstract class AbstractState {abstract void handle(Context context);
}class ConcreteStateA extends AbstractState {void handle(Context context) {System.out.println("Handle in state A");context.setState(new ConcreteStateB());}
}class ConcreteStateB extends AbstractState {void handle(Context context) {System.out.println("Handle in state B");context.setState(new ConcreteStateA());}
}class OneMoreClass {public static void main(String[] args) {Context context = new Context();context.setState(new ConcreteStateA());context.request();context.request();}
}

在这个例子中,我们定义了一个名为OneMoreClass的类,用于展示状态模式的使用。在OneMoreClass类的main方法中,我们创建了一个Context对象,并通过setState方法设置了初始状态为ConcreteStateA,然后通过request方法触发状态转换。

contains
1
1
extends
extends
uses
Context
-AbstractState state
+setState(AbstractState state)
+request()
«abstract»
AbstractState
+handle(Context context)
ConcreteStateA
+handle(Context context)
ConcreteStateB
+handle(Context context)
OneMoreClass
+main(args)

通过这样的结构和组成,状态模式可以让我们的代码更加清晰,更加易于理解和维护。接下来,我们将通过一个互联网电子商务项目中的Java实例,进一步展示如何实现状态模式。

状态模式的Java实例

在前面,我们已经对状态模式的基本概念和结构有了一定的了解。现在,让我们通过一个具体的Java实例来看看如何在实际项目中实现状态模式。假设我们正在开发一个互联网电子商务项目,其中有一个Order订单类,订单的状态有多种,比如新订单、已支付、已发货等,每种状态下订单的行为也各不相同。

首先,我们需要定义一个上下文类,也就是订单类Order。这个类中维护了一个State状态对象,这个State对象定义了订单在当前状态下的行为。

public class Order {private State state;public void setState(State state) {this.state = state;}public void behavior() {this.state.behavior();}
}

接着,我们定义一个抽象状态类State,这个类定义了所有状态共有的行为接口。

public abstract class State {public abstract void behavior();
}

然后,我们根据订单的实际状态,定义出多个具体的状态类,比如NewOrderStatePaidStateDeliveredState等。这些类继承自State抽象状态类,并实现了behavior方法,定义了在该状态下订单的行为。

public class NewOrderState extends State {@Overridepublic void behavior() {System.out.println("新订单,等待支付");}
}public class PaidState extends State {@Overridepublic void behavior() {System.out.println("已支付,等待发货");}
}public class DeliveredState extends State {@Overridepublic void behavior() {System.out.println("已发货,等待收货");}
}

这样,我们就实现了一个简单的状态模式。在实际的使用中,只需要改变Order订单对象的状态,就可以改变订单的行为。而且,如果需要增加新的状态,只需要增加新的状态类即可,无需修改Order类,符合开闭原则。

contains
1
1
extends
extends
extends
Order
-State state
+setState(State state)
+behavior()
«abstract»
State
+behavior()
NewOrderState
+behavior()
PaidState
+behavior()
DeliveredState
+behavior()

然而,虽然状态模式有许多优点,但也存在一些缺点,接下来我们将详细探讨状态模式的优缺点。

状态模式的优缺点

在前面,我们已经通过一个具体的Java例子详细地介绍了状态模式的实现过程,现在我们来讨论一下状态模式的优缺点,以及它在实际开发中的应用场景。

首先,让我们来看看状态模式的优点。一大优点就是它能够减少系统中的条件语句。在传统的程序设计中,我们通常会使用if-else或者switch-case语句来处理对象的状态转换,但这样做的问题是,随着状态的增多,条件语句也会越来越复杂,这对于代码的可读性和可维护性都是一种负面影响。而状态模式能够将每个状态的行为封装在一个类中,通过改变对象的状态来改变其行为,从而避免了复杂的条件语句。

其次,状态模式非常易于扩展。当我们需要添加一个新的状态时,只需要定义一个新的状态类即可,无需修改原有的代码,这符合了开闭原则。

然而,状态模式也有其缺点。那就是状态类的数量可能会过多,尤其是在状态非常复杂的情况下。每一个状态都对应一个状态类,这会导致系统中类的数量增多,增加了系统的复杂性。

至于状态模式的适用场景,一般来说,当一个对象的行为依赖于其状态,并且它需要在运行时刻改变其行为时,就可以考虑使用状态模式。例如,在电商平台中,订单的状态有多种,如待支付、已支付、待发货、已发货、已完成等,每种状态下订单的行为都是不同的,这就是一个典型的状态模式的应用场景。

总的来说,状态模式是一种非常实用的设计模式,它能够帮助我们更好地管理和控制对象的状态转换,提高代码的可读性和可维护性。但我们也要注意避免状态类的过度增多,使得系统过于复杂。

总结

在这个编程的海洋中,状态模式就像一艘小船,它能够根据风向(状态)改变航向(行为),让我们的代码更加清晰、易于理解和维护。它是我们处理复杂对象状态转换,减少条件语句的重要工具。但是,我们也要注意,每一个状态都对应一个状态类,这可能会导致状态类的数量过多,增加系统的复杂性。因此,我们在使用状态模式时,既要看到它的优点,也要注意它的缺点,恰如其分地使用,才能真正提高我们的代码质量。

在我们的编程生涯中,我们会遇到各种各样的设计模式,就像在海洋中遇到的各种各样的风向。有的风向会帮助我们顺利前行,有的风向则可能会让我们迷失方向。但无论如何,我们都要有勇气去面对,有智慧去选择,因为这就是编程,这就是我们的生活。

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

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

相关文章

微信小程序原生<map>地图实现标记多个位置以及map 组件 callout 自定义气泡

一、老规矩先上效果图: 二、在pages文件夹下新建image文件夹用来存放标记的图片。 三、代码片段 也可以参考小程序文档:https://developers.weixin.qq.com/miniprogram/dev/component/map.html index.wxml代码 <mapid="map"style="width: 100%; height:1…

企业专业化管理金字塔:技能进阶与案例分析

在纷繁复杂的企业管理领域中&#xff0c;一套行之有效的管理技能体系对于企业的稳健发展至关重要。本文将深入探讨企业专业化管理金字塔的五个层次&#xff1a;基本的管理技能、业务操作管理技能、组织管理技能、组织开发技能以及管理转变技能&#xff0c;并结合实际案例&#…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

信息检索(十三):On Complementarity Objectives for Hybrid Retrieval

On Complementarity Objectives for Hybrid Retrieval 摘要1. 引言2. 相关工作2.1 稀疏和密集检索2.2 互补性 3. 提出方法3.1 Ratio of Complementarity (RoC)3.2 词汇表示&#xff08;S&#xff09;3.3 语义表示&#xff08;D&#xff09;3.4 互补目标 4. 实验4.1 实验设置4.2…

关系数据库:关系数据结构基础与概念解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Nginx学习与使用

Nginx 什么是NginxNginx命令Nginx 配置文件文件组成全局块&#xff1a;配置服务器整体运行的配置指令Events块&#xff1a;影响Nginx服务器与用户的网络连接Http块Http全局块Server块全局Server快Location块 配置实例Nginx配置实例——反向代理 什么是Nginx Nginx命令 1.使用…

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

数据资产管理解决方案:构建高效、安全的数据生态体系

在数字化时代&#xff0c;数据已成为企业最重要的资产之一。然而&#xff0c;如何有效管理和利用这些数据资产&#xff0c;却是许多企业面临的难题。本文将详细介绍数据资产管理解决方案&#xff0c;帮助企业构建高效、安全的数据生态体系。 一、引言 在信息化浪潮的推动下&a…

Geostationary IR Channel Brightness Temperature - GridSat B1 -- shell下载

进入网页 https://www.ncei.noaa.gov/products/gridded-geostationary-brightness-temperature 然后进入数据目录&#xff0c;通过https的方式进行下载&#xff1a; 点击后进入如下界面&#xff1a; 点击任意年份进行下载 这里以2004年为例&#xff0c;如下所示&#xff1…

Go语言中的锁与管道的运用

目录 1.前言 2.锁解决方案 3.管道解决方案 4.总结 1.前言 在写H5小游戏的时候&#xff0c;由于需要对多个WebSocket连接进行增、删、查的管理和对已经建立连接的WebSocket通过服务端进行游戏数据交换的需求。于是定义了一个全局的map集合进行连接的管理&#xff0c;让所有…

力扣每日一道系列 --- LeetCode 160. 相交链表

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构探索 ✅LeetCode每日一道 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 LeetCode 160. 相交链表 思路&#xff1a; 首先计算两个链表的长度&#xff0c;然后判断两个链…

华为组网:核心交换机旁挂防火墙,基于ACL重定向配置实验

如图所示&#xff0c;由于业务需要&#xff0c;用户有访问Internet的需求。 用户通过接入层交换机SwitchB和核心层交换机SwitchA以及接入网关Router与Internet进行通信。为了保证数据和网络的安全性&#xff0c;用户希望保证Internet到服务器全部流量的安全性&#xff0c;配置重…

海外社交营销为什么用云手机?不用普通手机?

海外社交营销作为企业拓展海外市场的重要手段&#xff0c;正日益受到企业的青睐。云手机以其成本效益和全球性特征&#xff0c;成为海外社交营销领域的得力助手。那么&#xff0c;究竟是什么特性使得越来越多的企业选择利用云手机进行海外社交营销呢&#xff1f;下文将对此进行…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…

es 集群安全认证

参考文档&#xff1a;Configure security for the Elastic Stack | Elasticsearch Guide [7.17] | Elastic ES敏感信息泄露的原因 Elasticsearch在默认安装后&#xff0c;不提供任何形式的安全防护不合理的配置导致公网可以访问ES集群。比如在elasticsearch.yml文件中,server…

面试算法-51-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {dfs(root);re…

PTA一笔画

作者 张志梅 单位 青岛大学 小丁最近迷恋上一个游戏&#xff0c;传说中的“一笔画”游戏。 那么什么是一笔画&#xff1f;如下图&#xff0c;顾名思义就是一笔可以完成的图。一笔画最基本的要求是在画图的过程中&#xff0c;笔不能离开纸&#xff0c;且笔所画过的线不能重复…

使用Java JDBC连接数据库

在Java应用程序中&#xff0c;与数据库交互是一个常见的任务。Java数据库连接&#xff08;JDBC&#xff09;是一种用于在Java应用程序和数据库之间建立连接并执行SQL查询的标准API。通过JDBC&#xff0c;您可以轻松地执行各种数据库操作&#xff0c;如插入、更新、删除和查询数…

【计算机考研】408全年复习保姆级规划+资料

基础阶段 408一共只分为选择题和大题&#xff0c;选择题80分&#xff0c;大题70分。 基础阶段应该要形成相对完整的知识体系&#xff0c;基础知识大概都需要有印象。 在基础阶段&#xff0c;建议不做大题&#xff0c;把课后选择题都好好的做一遍 第一遍的正确率无需过于关注…