03-JAVA设计模式-状态模式

devtools/2024/11/11 6:21:47/

状态模式

什么是状态模式

Java中的状态模式(State Pattern)是一种行为型设计模式,主要用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。状态模式允许一个对象在其内部状态改变时改变它的行为,使得对象看起来似乎修改了它的类。

优点:

  • 结构清晰:通过将状态转换逻辑分布到独立的状态类中,状态模式将对象的行为与对应的状态分离,使得代码结构更加清晰,易于理解。
  • 灵活性和可扩展性:状态模式使得在修改对象状态时,不需要修改对象的行为方法,从而提高了系统的灵活性和可扩展性。同时,新的状态可以很容易地引入,而无需修改已有的状态类或上下文。
  • 降低耦合度:状态模式将对象的状态从主体中分离出来并将其封装在独立的状态类中,使得主体和状态之间的耦合度降低,提高了系统的可维护性。

缺点:

  • 增加类和对象的个数:由于每个状态都被封装成独立的对象,因此状态模式可能会导致系统中类和对象的个数增加,从而增加系统的复杂度和实现难度。
  • 使用条件较为苛刻:状态模式要求将状态转换逻辑包含在具体状态类中,因此只适合状态不多且状态转换比较少的情况。如果状态机过于复杂,使用状态模式可能会导致系统的维护和扩展变得困难。

常见场景:

  • 任务状态管理:如任务的创建、进行中、暂停、完成等状态。
  • 订单状态管理:如订单的待支付、已支付、待发货、已发货、已完成等状态。
  • 线程状态管理:如线程的创建、就绪、运行、阻塞、终止等状态。

案例

通过状态模式实现订单状态管理

UML

在这里插入图片描述

实现步骤:

  • 创建订单状态接口,定义通过上限文处理订单状态的接口
  • 创建上限文,持有订单状态的引用,提供通过订单状态引用调用订单状态实现类的具体方法
  • 创建不同订单状态,实现订单状态接口的方法

实现代码

OrderState.java

java">// 订单状态接口
public interface OrderState {void handleState(Context context);
}

Context.java

java">// 上下文
public class Context {private OrderState orderState;public Context(OrderState orderState) {this.orderState = orderState;}public void setOrderState(OrderState orderState) {this.orderState = orderState;}public void request(){this.orderState.handleState(this);}
}

PlaceOrder.java

java">// 下单
public class PlaceOrder implements OrderState {@Overridepublic void handleState(Context context) {System.out.println("下单-当前状态:待支付");}
}

PayOrder.java

java">// 支付
public class PayOrder implements OrderState {@Overridepublic void handleState(Context context) {System.out.println("支付-当前状态:已支付");}
}

SendGoods.java

java">// 发货
public class SendGoods implements OrderState {@Overridepublic void handleState(Context context) {System.out.println("发货-当前状态:已发货");}
}

TestClient.java

java">public class TestClient {public static void main(String[] args) {// 创建上下文Context context = new Context(new PlaceOrder());context.request();context.setOrderState(new PayOrder());context.request();context.setOrderState(new SendGoods());context.request();}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git


http://www.ppmy.cn/devtools/17443.html

相关文章

笔记:Python 循环结构练习题

文章目录 前言一、Python 循环结构是什么?二、选择题2.填空题 总结 前言 欢迎来到Python循环结构的练习题目录!本系列旨在帮助您巩固和提升您对Python循环结构的理解和应用能力。循环结构是编程中的重要概念之一,通过它,您可以轻…

OpenStack云计算(十)——OpenStack虚拟机实例管理,增加一个计算节点并进行实例冷迁移,增加一个计算节点的步骤,实例冷迁移的操作方法

项目实训一 本实训任务对实验环境要求较高,而且过程比较复杂,涉及的步骤非常多,有一定难度,可根据需要选做。可以考虑改为直接观看相关的微课视频 【实训题目】 增加一个计算节点并进行实例冷迁移 【实训目的】 熟悉增加一个…

MATLAB实现蚁群算法优化柔性车间调度(ACO-fjsp)

蚁群算法优化车间调度的步骤可以分为以下几个主要阶段: 1.初始化阶段: 设置算法参数,如信息素浓度、启发式因子等。这些参数将影响蚂蚁在选择路径时的决策过程。 确定车间调度的具体问题规模,包括工件数量、机器数量以及每个工件…

模拟电路 第三章(模拟集成电路)

一、模拟集成电路中的直流偏置技术 1、镜像电流源 镜像电流源的电路图如下图所示,、的参数完全相同,即、,由于两管具有相同的基-射极间电压(),所以、。当BJT的较大时,基极电流可以忽略&#xf…

C语言求 MD5 值

MD5值常被用于验证数据的完整性,嵌入式开发时经常用到。md5sum命令可以求MD5码,下面介绍如何用C语言实现MD5功能。 一、求字符串MD5值 1、md5sum命令 $ echo -n "12345678" | md5sum //获取"12345678"字符串的md5值 结果&…

html、css、QQ音乐移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示

CSDN将我上传的免费资源私自变成VIP专享资源,且作为作者的我不可修改为免费资源,不可删除,寻找客服无果,很愤怒,(我发布免费资源就是希望大家能免费一起用、一起学习),接下来继续寻找…

百度沈抖:智能,生成无限可能

4月16日,Create 2024百度AI开发者大会在深圳举行。会上,百度集团执行副总裁、百度智能云事业群总裁沈抖正式发布新一代智能计算操作系统——百度智能云万源。它能管理万卡规模的集群,极致地发挥GPU、CPU的性能;它有强大的大模型作…

Js-JavaScript-三种弹出提示框-alert-confirm-prompt-ai插件

文章目录 1.alert-提示框2.confirm-确认框3.prompt-输入框4.总结 1.alert-提示框 alert (message: string , title: string , errorIcon: Boolean ) Core JavaScript Classes Displays an alert box message: Data Type: string The text to display title (optional): Data Ty…