设计模式:生活中的责任链模式

责任链模式可以用一个日常生活中的接力赛来类比。在接力赛中,每个跑步者负责赛道的一段距离,然后将接力棒传递给下一个跑步者,直到最后一个跑步者完成比赛。每个跑步者都有机会跑自己的那一段,但如果他跑不了,他需要将接力棒交给下一个跑步者。

类似地,在责任链模式中,每个处理对象(就像跑步者)都有机会处理请求(就像接力棒)。如果当前处理对象无法处理请求或者认为下一个处理对象更适合处理该请求,它会将请求传递给链中的下一个处理对象。

让我们通过一个具体的生活场景来进一步深入理解责任链模式:

想象一下,你在一家餐厅就餐。你想要点一些特别的菜,但不确定餐厅是否能满足你的需求。于是,你向服务员询问,服务员是请求链上的第一个环节。

  1. 服务员(第一级处理者):服务员首先听取你的请求,并尝试理解和满足你的需求。如果你的请求是简单的,比如需要额外的餐巾纸,服务员可以直接满足。这就像责任链模式中的处理对象直接处理请求。

  2. 领班(第二级处理者):如果你的请求是服务员无法满足的,比如你想要为特殊场合装饰餐桌,服务员可能需要询问领班。领班有更多的权限和资源来处理更复杂的请求。

  3. 厨师(第三级处理者):如果你的请求与食物的特殊制作有关,比如你有特定的食物过敏并需要定制菜单,服务员会将你的需求传递给厨师。厨师是责任链中的另一个环节,他们有能力决定是否能根据你的要求准备食物。

  4. 餐厅经理(最终处理者):最后,如果你的请求非常特殊,比如你想要在餐厅举办一个惊喜派对并需要特别的安排,这时候可能就需要餐厅经理来决定了。餐厅经理是责任链中的最后一环,他们有最终的决策权。

在整个过程中,每个处理者都有自己的责任和权限范围。他们可以处理在自己能力范围内的请求,如果处理不了,就把请求传递给下一个处理者。责任链模式的好处是,请求的发送者不需要知道谁是最终处理者,他们只需要等待请求得到处理即可。
让我们用一个餐饮服务的例子来演示责任链模式,类似于之前的类比。在这个例子中,当客人提出特殊请求时,服务员、领班、厨师和餐厅经理将根据他们的职责和权限来处理请求。

以下是用Java编写的示例代码:

// 请求类
class CustomerRequest {private String requestType;private String requestDescription;public CustomerRequest(String requestType, String requestDescription) {this.requestType = requestType;this.requestDescription = requestDescription;}public String getRequestType() {return requestType;}public String getRequestDescription() {return requestDescription;}
}// 抽象处理者
abstract class Staff {protected Staff successor;public void setSuccessor(Staff successor) {this.successor = successor;}public abstract void handleRequest(CustomerRequest request);
}// 具体处理者:服务员
class Waiter extends Staff {@Overridepublic void handleRequest(CustomerRequest request) {if ("simple".equals(request.getRequestType())) {System.out.println("Waiter handled the request: " + request.getRequestDescription());} else if (successor != null) {successor.handleRequest(request);}}
}// 具体处理者:领班
class Supervisor extends Staff {@Overridepublic void handleRequest(CustomerRequest request) {if ("complex".equals(request.getRequestType())) {System.out.println("Supervisor handled the request: " + request.getRequestDescription());} else if (successor != null) {successor.handleRequest(request);}}
}// 具体处理者:厨师
class Chef extends Staff {@Overridepublic void handleRequest(CustomerRequest request) {if ("food".equals(request.getRequestType())) {System.out.println("Chef handled the request: " + request.getRequestDescription());} else if (successor != null) {successor.handleRequest(request);}}
}// 具体处理者:餐厅经理
class Manager extends Staff {@Overridepublic void handleRequest(CustomerRequest request) {// 经理可以处理所有类型的请求System.out.println("Manager handled the request: " + request.getRequestDescription());}
}// 客户端
public class RestaurantServiceChain {public static void main(String[] args) {// 创建责任链Staff waiter = new Waiter();Staff supervisor = new Supervisor();Staff chef = new Chef();Staff manager = new Manager();// 设置责任链的顺序waiter.setSuccessor(supervisor);supervisor.setSuccessor(chef);chef.setSuccessor(manager);// 创建请求并处理它们CustomerRequest simpleRequest = new CustomerRequest("simple", "Can I have extra napkins?");CustomerRequest complexRequest = new CustomerRequest("complex", "Can we get a table with a better view?");CustomerRequest foodRequest = new CustomerRequest("food", "I have a nut allergy. Can you prepare a nut-free meal?");CustomerRequest undefinedRequest = new CustomerRequest("undefined", "Can we have a live band tonight?");waiter.handleRequest(simpleRequest);waiter.handleRequest(complexRequest);waiter.handleRequest(foodRequest);waiter.handleRequest(undefinedRequest);}
}

在这个例子中,每个处理者(服务员、领班、厨师和经理)依据自己的职责处理请求。如果他们不能处理,就会传递给链中的下一个处理者。这样的设计允许灵活地处理各种类型的客户请求,同时保持处理者之间的解耦。

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

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

相关文章

uniapp如何配置后使用uni.chooseLocation等地图位置api

在uniapp中想要使用uni.getLocation、uni.chooseLocation ……api的时候我们需要在小程序就开启配置,不然无法使用。 第一步:首先找到manifest.json 第二步:点击源码视图 第三步:在 mp-weixin 加入下面代码 "permission&…

Paper Digest | GPT-RE:基于大语言模型针对关系抽取的上下文学习

持续分享 SPG 及 SPG LLM 双驱架构应用相关进展 1、动机 在很多自然语言处理任务中,上下文学习的性能已经媲美甚至超过了全资源微调的方法。但是,其在关系抽取任务上的性能却不尽如人意。以 GPT-3 为例,一些基于 GPT-3 的上下文学习抽取方…

DXP学习002-PCB编辑器的环境参数及电路板参数相关设置

目录 一,dxp的pcb编辑器环境 1,创建新的PCB设计文档 2,PCB编辑器界面 1)布线工具栏 2)公用工具栏 3)层标签栏 ​编辑 3,PCB设计面板 1)打开pcb设计面板 4,PCB观…

【HTML】简单制作一个分形动画

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言,本文将详细介绍一段代码,具体内容如下: 开始 首先新建文件夹,创建一个文本文档,其中HTML的文件名改为[index.html]&a…

JavaEE初阶之单例模式详解

目录 题外话 正题 单例模式 概念 优点 缺点 饿汉式单例模式 代码及详解 懒汉式单例模式 代码及详解 小结 题外话 昨天爬山去了,回来吃了个烧烤有点累,昨天旷了一天,每周稳定发个五篇文章是没什么太大问题的 正题 单例模式 概念 是一种常见的软件设计模式,确保一个类…

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址(通过ip访问) //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…

电商技术揭秘十四:大数据平台的选择与构建

相关系列文章 电商技术揭秘一:电商架构设计与核心技术 电商技术揭秘二:电商平台推荐系统的实现与优化 电商技术揭秘三:电商平台的支付与结算系统 电商技术揭秘四:电商平台的物流管理系统 电商技术揭秘五:电商平台…

2024年MathorCup数学建模挑战赛A题B题C题D题思路模型代码

2024年MathorCup数学建模挑战赛 2024年MathorCup数学建模挑战赛A题B题C题D题思路模型代码开赛后第一时间更新:更新见文末 01 组织单位 主办单位:中国优选法统筹法与经济数学研究会 报名网址: https://www.saikr.com/vse/mathorcup/202…

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言 昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章,今天来讲下另外一种方式,不需要RabbitMQ的插件。 前期准备,需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和R…

AWS入门实践-在EC2上部署Wordpress网站

在AWS EC2上部署WordPress涉及到几个步骤,包括启动EC2实例、配置数据库、安装WordPress等。以下是详细的步骤和相应的命令脚本 第一步: 启动 EC2 实例 登录 AWS 控制台,进入 EC2 服务启动一个新的 EC2 实例,选择 Amazon Linux 2 AMI选择合适的实例类型(例如 t2.mi…

Java-接口-定义接口Filter及其实现类WordFilter

所谓:“纸上得来终觉浅,绝知此事要躬行。” 关于接口的知识,可以几分钟过一遍:Java-接口—知识(基础)-CSDN博客 现在就是练习time,先来看题: 定义一个接口 Filter,表示…

linux之shell命令

shell基础命令 浏览Linux 文件系统 Linux 系统目录结构 /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 /dev &…

免费分享 .NET C#面试宝典

为.NET和C#开发者准备的全面指南,涵盖了从基础知识到高级应用的各个方面。以下是对手册内容的详细总结,分为多个关键点进行阐述。 1. 基础语法和数据类型 数据类型和变量:手册介绍了基本数据类型如int、double、bool等,以及如何…

微服务初始及Eureka注册中心

1,架构演变 单体架构:将所有业务功能集中在一个项目中开发,达成一个包部署 优点:架构简单,部署成本低 缺点:项目耦合度高 分布式架构:根据业务功能对系统进行拆分,每个业务作为独…

PCB学习记录-----入门基础知识

一、搭建环境 1.下载嘉立创EDA 软件下载 - 嘉立创EDA (lceda.cn) 选专业版 在线编辑:嘉立创EDA(专业版) - V2.1.45 (lceda.cn) 官方教程:立创EDA专业版-使用教程 (lceda.cn) 2.新建工程 文件-新建-项目,右键Board1可以重命名&#xff…

在mac环境下使用shell脚本实现tree命令

文章目录 使用ls实现tree使用find实现tree 使用ls实现tree 实现思路 使用ls -F 打印文件类型,如果是目录后面跟/,如果是可执行文件后面跟*;使用grep -v /$ 筛选文件排除目录,-v为反向筛选;使用grep /$ 仅筛选目录&am…

-bash: cd: /etc/hadoop: 没有那个文件或目录

解决办法:source /etc/profile 运行 source /etc/profile 命令会重新加载 /etc/profile 文件中的配置,这样做的目的是使任何更改立即生效,而不需要注销并重新登录用户。通常,/etc/profile 文件包含系统范围的全局 Shell 配置&…

密文模糊检索

对密文数据进行分词组合,将分词组合的结果集分别进行加密,查询时通过key like %partial%。 先对字符进行固定长度的分组,将一个字段拆分为多个,比如说根据4位英文字符(半角),2个中文字符&#…

设计流程与内容:SQL注入、跨站脚本攻击(XSS)及未授权访问漏洞防护

设计流程与内容:SQL注入、跨站脚本攻击(XSS)及未授权访问漏洞防护 一、引言 随着信息技术的飞速发展,Web应用程序已成为人们日常生活和工作中不可或缺的一部分。然而,这些应用程序的安全性却时常受到各种威胁&#x…

asp.net网上水果销售平台 水果购物商城系统+sqlserver

网上水果销售平台 说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于asp.net架构和sql server数据库 功能模块: asp.net网上水果销售平台 水果购物商城系统 用户功能有 网站首页 全部水果 我的订单 购物车用户…