当前位置: 首页 > news >正文

编程-设计模式 13:责任链模式

设计模式 13:责任链模式

定义与目的
  • 定义:责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  • 目的:该模式的主要目的是通过将处理请求的责任分配给一系列的对象,从而降低对象之间的耦合度,并提供一种动态指定处理请求的对象的方法。
实现示例

假设我们有一个电子邮件处理系统,需要处理各种类型的电子邮件,包括普通邮件、重要邮件和紧急邮件。我们可以使用责任链模式来实现这个需求。

// 抽象处理者
abstract class Handler {protected Handler nextHandler;public void setNext(Handler handler) {this.nextHandler = handler;}public abstract void handleRequest(String emailType);
}// 具体处理者 - 普通邮件处理器
class NormalEmailHandler extends Handler {@Overridepublic void handleRequest(String emailType) {if (emailType.equals("normal")) {System.out.println("Normal Email handled by NormalEmailHandler");} else if (nextHandler != null) {nextHandler.handleRequest(emailType);}}
}// 具体处理者 - 重要邮件处理器
class ImportantEmailHandler extends Handler {@Overridepublic void handleRequest(String emailType) {if (emailType.equals("important")) {System.out.println("Important Email handled by ImportantEmailHandler");} else if (nextHandler != null) {nextHandler.handleRequest(emailType);}}
}// 具体处理者 - 紧急邮件处理器
class UrgentEmailHandler extends Handler {@Overridepublic void handleRequest(String emailType) {if (emailType.equals("urgent")) {System.out.println("Urgent Email handled by UrgentEmailHandler");} else if (nextHandler != null) {nextHandler.handleRequest(emailType);}}
}// 客户端代码
public class Client {public static void main(String[] args) {Handler normalEmailHandler = new NormalEmailHandler();Handler importantEmailHandler = new ImportantEmailHandler();Handler urgentEmailHandler = new UrgentEmailHandler();normalEmailHandler.setNext(importantEmailHandler);importantEmailHandler.setNext(urgentEmailHandler);normalEmailHandler.handleRequest("normal");normalEmailHandler.handleRequest("important");normalEmailHandler.handleRequest("urgent");normalEmailHandler.handleRequest("unknown");}
}
使用场景
  • 当你需要避免请求发送者与接收者的直接耦合时。
  • 当处理一个请求的算法应该可以根据运行时信息动态地变化时。
  • 当存在多个处理者,并且需要按照一定的顺序处理请求时。

责任链模式通过将请求处理的责任分配给一系列对象,从而降低了对象之间的耦合度。这对于需要动态地指定处理请求的对象的场景非常有用。

小结

责任链模式是一种常用的行为型模式,它可以帮助你构建一个处理请求的链条,使得请求可以被多个对象处理,并且可以根据需要动态地改变处理请求的顺序。这对于需要灵活处理请求的场景非常有用。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Conda的自动化魔法:一探auto_activate_base的奥秘
  • Redis 为什么读写性能高?
  • 【Android Git】Git版本回退方式
  • 为啥说SPFA已死?三种图论算法太难懂?深入浅出谈图论,看这篇文章就够了
  • docker系列11:Dockerfile入门
  • Java | Leetcode Java题解之第332题重新安排行程
  • JAVA开发学习-day21
  • 【sdk】- 对接阿里云抠图
  • C++ //练习 16.42 对下面每个调用,确定T和val的类型:
  • linux 6.10.0 CXL/memdev.c 详解
  • 【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决
  • Java中等题-不同二叉搜索树(力扣)
  • sqli-labs-master
  • C++快速理解之封装
  • 使用开源 LLM 充当 LangChain 智能体
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Java 多线程编程之:notify 和 wait 用法
  • Java方法详解
  • java中的hashCode
  • Mysql5.6主从复制
  • MySQL用户中的%到底包不包括localhost?
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 程序员最讨厌的9句话,你可有补充?
  • 技术发展面试
  • 利用jquery编写加法运算验证码
  • 七牛云假注销小指南
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端面试之闭包
  • 巧用 TypeScript (一)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 一道面试题引发的“血案”
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (27)4.8 习题课
  • (31)对象的克隆
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (待修改)PyG安装步骤
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (六)DockerCompose安装与配置
  • (七)Knockout 创建自定义绑定
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .net core 的缓存方案
  • .net和jar包windows服务部署
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @Data注解的作用
  • @RequestBody详解:用于获取请求体中的Json格式参数
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [Django ]Django 的数据库操作
  • [HackMyVM]靶场 VivifyTech
  • [Hadoop in China 2011] Hadoop之上 中国移动“大云”系统解析