【设计模式】行为型模式(三):责任链模式、状态模式

行为型模式(三):责任链模式、状态模式

  • 5.责任链模式(Chain of Responsibility)
    • 5.1 通俗易懂的解释
    • 5.2 具体步骤
    • 5.3 代码示例
      • 5.3.1 处理者接口
      • 5.3.2 具体处理者
      • 5.3.3 测试类
      • 5.3.4 输出
    • 5.4 总结
  • 6.状态模式(State)
    • 6.1 通俗易懂的解释
    • 6.2 具体步骤
    • 6.3 代码示例
      • 6.3.1 定义状态接口
      • 6.3.2 具体状态
      • 6.3.3 定义上下文类
      • 6.3.4 测试类
      • 6.3.5 输出
    • 6.4 总结

5.责任链模式(Chain of Responsibility)

责任链模式Chain of Responsibility)是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理该请求。每个处理者都可以决定是否处理该请求,或者将请求传递给下一个处理者。这样可以将请求的处理逻辑分散到多个处理者中,而不是集中在一个地方。

5.1 通俗易懂的解释

想象一下你在一个公司里,有一个请假的流程。员工请假时,需要经过多个审批环节,比如:

  • 直接上级:首先由直接上级审批。
  • 部门经理:如果直接上级批准了,再由部门经理审批。
  • 人力资源部:如果部门经理也批准了,最后由人力资源部审批。

在这个过程中,每个审批者都有权决定是否批准请假请求,或者将请求传递给下一个审批者。如果某个审批者拒绝了请求,流程就结束了。如果所有审批者都批准了,员工的请假请求就通过了。

在这里插入图片描述

5.2 具体步骤

  • 创建请求:员工提交请假请求。
  • 传递请求:请求首先传递给直接上级。
  • 处理请求
    • 如果直接上级批准,请求传递给部门经理。
    • 如果部门经理批准,请求传递给人事部。
    • 如果人事部批准,请求处理完成。
    • 如果任何一个审批者拒绝,请求处理结束。

5.3 代码示例

下面是一个简单的 Java 代码示例,展示了责任链模式的实现。

5.3.1 处理者接口

// 定义处理者接口
interface Handler {void setNext(Handler next);void handleRequest(String request);
}

5.3.2 具体处理者

// 具体处理者类
class DirectSupervisor implements Handler {private Handler next;@Overridepublic void setNext(Handler next) {this.next = next;}@Overridepublic void handleRequest(String request) {if (request.equals("请假1天")) {System.out.println("直接上级批准了你的请假请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("没有更多审批者了");}}
}class DepartmentManager implements Handler {private Handler next;@Overridepublic void setNext(Handler next) {this.next = next;}@Overridepublic void handleRequest(String request) {if (request.equals("请假3天")) {System.out.println("部门经理批准了你的请假请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("没有更多审批者了");}}
}class HR implements Handler {private Handler next;@Overridepublic void setNext(Handler next) {this.next = next;}@Overridepublic void handleRequest(String request) {if (request.equals("请假7天")) {System.out.println("人力资源部批准了你的请假请求");} else if (next != null) {next.handleRequest(request);} else {System.out.println("没有更多审批者了");}}
}

5.3.3 测试类

// 测试类
public class ChainOfResponsibilityExample {public static void main(String[] args) {Handler directSupervisor = new DirectSupervisor();Handler departmentManager = new DepartmentManager();Handler hr = new HR();// 设置责任链directSupervisor.setNext(departmentManager);departmentManager.setNext(hr);// 测试请求directSupervisor.handleRequest("请假1天");directSupervisor.handleRequest("请假3天");directSupervisor.handleRequest("请假7天");directSupervisor.handleRequest("请假10天");}
}

5.3.4 输出

直接上级批准了你的请假请求
部门经理批准了你的请假请求
人力资源部批准了你的请假请求
没有更多审批者了

5.4 总结

责任链模式通过将请求沿着处理者链传递,使得每个处理者都可以决定是否处理该请求,或者将请求传递给下一个处理者。这样可以将处理逻辑分散到多个处理者中,提高代码的灵活性和可扩展性。

6.状态模式(State)

状态模式State)是一种行为设计模式,它允许一个对象在其内部状态改变时改变其行为。简单来说,就是让对象的行为随着其状态的变化而变化。这样可以避免大量的条件判断语句,使代码更加清晰和易于维护。

6.1 通俗易懂的解释

想象一下你有一个智能灯泡,它可以有三种状态:关闭、低亮度和高亮度。每种状态下,灯泡的行为是不同的:

  • 关闭状态:灯泡是暗的,按下开关后,灯泡会变成低亮度。
  • 低亮度状态:灯泡是亮的,但亮度较低,按下开关后,灯泡会变成高亮度。
  • 高亮度状态:灯泡是亮的,亮度较高,按下开关后,灯泡会变成关闭。

在这个例子中,灯泡的行为(即按下开关后的反应)会随着其状态的变化而变化。这就是状态模式的核心思想。

6.2 具体步骤

  • 定义状态接口:定义一个状态接口,声明所有状态共有的方法。
  • 实现具体状态:为每种状态实现一个具体的状态类,每个类实现状态接口中的方法。
  • 定义上下文:定义一个上下文类,持有当前状态的引用,并提供改变状态的方法。
  • 改变状态:在上下文类中,根据当前状态调用相应的方法,并在需要时改变状态。

6.3 代码示例

下面是一个简单的 Java 代码示例,展示了状态模式的实现。

6.3.1 定义状态接口

// 定义状态接口
interface LightState {void handleContext(LightContext context);String getStateName();
}

6.3.2 具体状态

// 具体状态类:关闭状态
class OffState implements LightState {@Overridepublic void handleContext(LightContext context) {System.out.println("灯泡从关闭状态变为低亮度状态");context.setState(new LowBrightnessState());}@Overridepublic String getStateName() {return "关闭状态";}
}// 具体状态类:低亮度状态
class LowBrightnessState implements LightState {@Overridepublic void handleContext(LightContext context) {System.out.println("灯泡从低亮度状态变为高亮度状态");context.setState(new HighBrightnessState());}@Overridepublic String getStateName() {return "低亮度状态";}
}// 具体状态类:高亮度状态
class HighBrightnessState implements LightState {@Overridepublic void handleContext(LightContext context) {System.out.println("灯泡从高亮度状态变为关闭状态");context.setState(new OffState());}@Overridepublic String getStateName() {return "高亮度状态";}
}

6.3.3 定义上下文类

// 定义上下文类
class LightContext {private LightState state;public LightContext() {this.state = new OffState(); // 初始状态为关闭}public void setState(LightState state) {this.state = state;}public void pressSwitch() {state.handleContext(this);}public String getCurrentStateName() {return state.getStateName();}
}
  • this 关键字:this 关键字在 Java 中表示当前对象的引用。在 pressSwitch 方法中,this 指的是调用 pressSwitch 方法的 LightContext 实例。
  • state.handleContext(this):这行代码调用了 state 对象的 handleContext 方法,并将 LightContext 的当前实例作为参数传递给 handleContext 方法。

6.3.4 测试类

// 测试类
public class StatePatternExample {public static void main(String[] args) {LightContext light = new LightContext();// 模拟按下开关light.pressSwitch(); // 关闭 -> 低亮度System.out.println("当前状态: " + light.getCurrentStateName());light.pressSwitch(); // 低亮度 -> 高亮度System.out.println("当前状态: " + light.getCurrentStateName());light.pressSwitch(); // 高亮度 -> 关闭System.out.println("当前状态: " + light.getCurrentStateName());}
}

6.3.5 输出

灯泡从关闭状态变为低亮度状态
当前状态: 低亮度状态
灯泡从低亮度状态变为高亮度状态
当前状态: 高亮度状态
灯泡从高亮度状态变为关闭状态
当前状态: 关闭状态

6.4 总结

状态模式通过将对象的行为封装在不同的状态类中,使得对象的行为随着其状态的变化而变化。这样可以避免大量的条件判断语句,使代码更加清晰和易于维护。

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

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

相关文章

CC3学习记录

🌸 CC3 之前学习到的cc1和cc6都是通过Runtime进行命令执行的,如果Runtime被加入黑名单的话,整个链子也就失效了。而cc3则是通过动态类加载机制进行任意代码执行的。 🌸 版本限制 JDK版本:8u65 Commons-Collections…

flutter字体大小切换案例 小字体,标准字体,大字体,超大字体案例

flutter字体大小切换案例 小字体&#xff0c;标准字体&#xff0c;大字体&#xff0c;超大字体案例 Android iOS设备带有选择记录 我的flutter项目版本 environment: sdk: ‘>3.4.4 <4.0.0’ 图片案例 pubspec.yaml 添加依赖 # 屏幕尺寸适配 https://github.com/OpenF…

设计模式(四)装饰器模式与命令模式

一、装饰器模式 1、意图 动态增加功能&#xff0c;相比于继承更加灵活 2、类图 Component(VisualComponent)&#xff1a;定义一个对象接口&#xff0c;可以给这些对象动态地添加职责。ConcreteComponent(TextView)&#xff1a;定义一个对象&#xff0c;可以给这个对象添加一…

django入门【05】模型介绍(二)——字段选项

文章目录 1、null 和 blank示例说明⭐ null 和 blank 结合使用的几种情况总结&#xff1a; 2、choices**choices 在 Django 中有以下几种形式&#xff1a;**&#xff08;1&#xff09; **简单的列表或元组形式**&#xff08;2&#xff09; **字典映射形式**&#xff08;3&#…

C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1

各位小伙伴们&#xff0c;上一期的保留小数位数教学够用一辈子&#xff0c;有不错的点赞量&#xff0c;可我连一个粉丝铁粉都没有&#xff0c;你愿意做我的第一个铁粉吗&#xff1f;OK废话不多说&#xff0c;开始&#xff01; 温故与知心 可能你也学过&#xff0c;且是工作者…

【提高篇】3.3 GPIO(三,工作模式详解 上)

目录 一,工作模式介绍 二,输入浮空 2.1 输入浮空简介 2.2 输入浮空特点 2.3 按键检测示例 2.4 高阻态 三,输入上拉 3.1 输入上拉简介 3.2 输入上拉的特点 3.3 按键检测示例 四,输入下拉 4.1 输入下拉简介 4.2 输入下拉特点 4.3 按键检测示例 一,工作模式介绍…

Thinkphp6视图介绍

一.MVC MVC 软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09; ThinkPHP6 是一个典型的 MVC 架构 控制器—控制器&#xff0c;用于将用户请求转发给相应的Model进行处理&a…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner &#xff08;25&#xff09; 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner &#xff08;25&#xff09;[toc]1、概述&#x1f41c;2、下载MTuner&#x1fab2;3、使用MTuner分析qt程序内存泄漏&#x1f9a7;4、相关地址&#x1f41…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

Redis下载历史版本

Linux版本&#xff1a; https://download.redis.io/releases/ Windows版本&#xff1a; https://github.com/tporadowski/redis/releases Linux Redis对应gcc版本

8 软件项目管理

软件项目管理 1、软件项目管理概念1.1 软件项目管理内容1.2 软件项目管理的4P要素人员产品过程项目 2、软件项目度量2.1 软件项目度量定义及度量方法2.2 面对规模的度量2.3 面对功能的度量UFC相关的五类组件14个复杂性调节因素 F i F_i Fi​一个功能点开发代码行数 2.4 软件估算…

游戏引擎学习第12天

视频参考:https://www.bilibili.com/video/BV1yom9YnEWY 这节没讲什么东西&#xff0c;主要是改了一下音频的代码 后面有介绍一些alloc 和malloc,VirtualAlloc 的东西 _alloca 函数&#xff08;或 alloca&#xff09;分配的是栈内存&#xff0c;它的特点是&#xff1a; 生命周…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

算法--解决二叉树遍历问题

第一 实现树的结构 class Node(): # 构造函数&#xff0c;初始化节点对象&#xff0c;包含数据和左右子节点 def __init__(self, dataNone): self.data data # 节点存储的数据 self.left None # 左子节点&#xff0c;默认为None self.rig…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…

算法闭关修炼百题计划(八)

一半来自力扣的push题单 1.最大连续1的个数II2.长度为k的无重复字符子串3.句子的相似性4.移位字符串分组5.x的平方根6.Z字形变换 1.最大连续1的个数II 给定一个二进制数组nums&#xff0c;如果最多可以翻转一个0&#xff0c;则返回数组中连续1的最大个数 之前是Window&#x…

论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用&#xff1a; inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 参考文档 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins.…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2&#xff1a;简单的语言模型社会解决复杂推理问题 论文地址&#xff1a;https://aclanthology.org/2024.emnlp-main.920/ 项目地址&#xff1a; https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…