设计模式——职责链模式

职责链模式

  • 职责链模式
  • 职责链模式解决什么问题?
  • 职责链模式实现

职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止

职责链模式解决什么问题?

如请假请求需要主管、经理、总经理批准

public class Request {private String type;private String content;private int number;public String getType() {return type;}public void setType(String type) {this.type = type;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}
}

创建类处理请求

public class Manager {protected String name;public Manager(String name) {this.name = name;}public void getResult(Request request) {if (name.equals("主管")) {if (request.getNumber() <= 2) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");} else {System.out.println(name + "无权处理");}} else if (name.equals("经理")) {if (request.getNumber() <= 5) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");} else {System.out.println(name + "无权处理");}} else if (name.equals("总经理")) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");}}
}

当提出请求时

Request request = new Request();
request.setContent("家里有事");
request.setType("请假");
request.setNumber(10);Manager manager = new Manager("主管");
manager.getResult(request);
Manager director = new Manager("经理");
director.getResult(request);
Manager generalDirector = new Manager("总经理");
generalDirector.getResult(request);
  • problem1:分支判断过长
  • problem2:当新增新的管理类别时,都要更改类

职责链模式实现

创建管理者类

abstract class Manager {protected String name;protected Manager superior;public Manager(String name) {this.name = name;}public void setSuperior(Manager superior) {this.superior = superior;}public abstract void requestApplications(Request request);
}

创建职责链处理请求

class CommonManager extends Manager {public CommonManager(String name) {super(name);}@Overridepublic void requestApplications(Request request) {if (request.getNumber() <= 2) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");} else {System.out.println(name + "无权处理");if (superior != null) {superior.requestApplications(request);}}}
}class Direct extends Manager {public Direct(String name) {super(name);}@Overridepublic void requestApplications(Request request) {if (request.getNumber() <= 5) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");} else {System.out.println(name + "无权处理");if (superior != null) {superior.requestApplications(request);}}}
}class GeneralDirector extends Manager {public GeneralDirector(String name) {super(name);}@Overridepublic void requestApplications(Request request) {System.out.println(name + "批准" + request.getContent() + "," + request.getType() + request.getNumber() + "天");}
}

传递过程

CommonManager manager = new CommonManager("主管");
Direct director = new Direct("经理");
GeneralDirector generalDirector = new GeneralDirector("总经理");manager.setSuperior(director);
director.setSuperior(generalDirector);Request request = new Request();
request.setContent("家里有事");
request.setType("请假");
request.setNumber(10);manager.requestApplications(request);

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

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

相关文章

e签宝,再「进化」

基于ePaaS&#xff0c;e签宝不仅打造了电子签领域的生态圈&#xff0c;也正在赋能整个SaaS行业奔向生态化的良性业态&#xff0c;这将使得SaaS厂商的边界愈发清晰&#xff0c;逐渐实现“量产”&#xff0c;奔向规模化。 作者|斗斗 出品|产业家 1957年11月&#xff0c;江苏…

基于Yolov8的野外烟雾检测(2):多维协作注意模块MCA,效果秒杀ECA、SRM、CBAM等 | 2023.9最新发布

目录 1.Yolov8介绍 2.野外火灾烟雾数据集介绍 3.MCA介绍 4.训练结果分析 5.系列篇 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它建立在先前…

phantomjs插件---实现通过链接生成网页截图

Phantomjs | PhantomJS 配置要求 windows下&#xff0c;安装完成phantomJS 设置phantomjs环境变量【也可直接使用phantomjs目录下的执行文件】 直接通过访问php文件执行/通过cmd命令行执行【phantomjs phantom_script.js】 linux下,安装完成phantomJS 设置phantomjs环境变量 直…

Jetpack Compose基础组件 - Image

Image的源码参数预览 Composable fun Image(painter: Painter,contentDescription: String?,modifier: Modifier Modifier,alignment: Alignment Alignment.Center,contentScale: ContentScale ContentScale.Fit,alpha: Float DefaultAlpha,colorFilter: ColorFilter? …

【业务功能篇108】CDN Nginx

CDN&#xff08;内容分发网络&#xff09;&#xff1a; CDN是一种分布式网络架构&#xff0c;通过将内容存储在多个地理位置的服务器上&#xff0c;以降低用户访问这些内容的延迟时间。这些服务器通常分布在全球各个地点&#xff0c;可以更快地向用户提供内容&#xff0c;减少了…

go net/http 源码解读

回顾 1. HTTP Server 在 go 中启动一个 http server 只需短短几行代码 func PingHandler(w http.ResponseWriter, r *http.Request) {io.WriteString(w, "pong!") }func main() {http.HandleFunc("/ping", PingHandler)log.Fatal(http.ListenAndServe(&…

问题记录:飞腾板卡,系统时启动卡住

这是一篇旧记录,但目前调试依然适用。 2019年12月份记录: FT-15000A/16核板卡,系统启动过程卡在麒麟图标处,无法稳定启动。 硬件环境: FT-1500A/16+显卡e8860+USB uPD720201+SATA 88SE9215 ‍ 现象描述: 现象1:使用两片进口LTM4620为CPU核电供电,常温16核工作正常…

如何去掉word上方页眉处的横线

一、问题描述 有时候word总会莫名其妙在页眉处出现一条横线&#xff0c;如图&#xff1a; 二、解决步骤 1.首先点击任一页眉进入页眉编辑状态&#xff0c;然后点击设计&#xff1a; 2.选择页面边框&#xff1a; 3.选择边框——选择无——选择应用于段落——完成。

【笔试强训选择题】Day44.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…

文本直接生成3D游戏场景、功能,用ChatGPT方式开发游戏!

3D游戏开发平台Hiber3D通过谷歌的PaLM大语言模型&#xff0c;结合自身500多个模板库&#xff0c;以及数百万个成品3D场景进行微调&#xff0c;推出了一个全新游戏开发平台。 该平台在生成式AI加持下&#xff0c;用户可以像使用ChatGPT那样&#xff0c;通过文本问答方式快速创建…

不同的图像质量评价指标(IQA)

一、NR-IQA 这是一种方法不是指标 “Non-Reference Image Quality Assessment”&#xff08;NR-IQA&#xff09;是一种图像质量评价&#xff08;Image Quality Assessment, IQA&#xff09;方法&#xff0c;通常用于评估图像的质量&#xff0c;而无需使用参考图像&#xff08;…

zabbix 钉钉微信企微告警(动作操作消息内容模板)

一、环境配置 1、配置zabbix服务端 2、配置监控主机&监控项&监控模板 zabbix配置安装_this page is used to test the proper operation of _疯飙的蜗牛的博客-CSDN博客 二、触发器 触发器的本质就是一个条件判断&#xff0c;对于不同的监控数据来说&#xff0c;我…

java 企业工程管理系统软件源码 自主研发 工程行业适用

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

从零开始的PICO开发教程(4)-- VR世界 射线传送、旋转和移动

从零开始的PICO开发教程&#xff08;4&#xff09;-- VR世界 射线传送、旋转和移动 文章目录 从零开始的PICO开发教程&#xff08;4&#xff09;-- VR世界 射线传送、旋转和移动一、前言1、大纲 二、VR射线移动功能实现与解析1、区域传送&#xff08;1&#xff09;新建 XR Orig…

志高团队:广阔前景 全新的投资理财体验

当今时代,数字金融迅猛发展,投资理财领域正在经历前所未有的重大变革。作为加拿大华企联合会控股旗下的重要项目,恒贵即将启动,旨在为广大投资者带来全新的投资理财体验。这一创新项目的优势和广阔前景受到了业内观察机构的广泛关注和期待。 恒贵作为一家全新的P2C多元化投资理…

YOLOv3模型原理深度解析

概况 &#xff08;1&#xff09;YOLOv3是YOLO系列第一次引入残差连接来解决深度网络中的梯度消失问题&#xff08;是不是第一次&#xff0c;有待你后面考证&#xff09;&#xff0c;实际用的backbone是DarkNet53 &#xff08;2&#xff09;最显著的改进&#xff0c;也是对你涨…

DM/达梦数据库查询或更新某一列中多个字典码对应内容

准备工作&#xff08;建表、插入数据&#xff09; 1、建立表格&#xff1a;学生-学习科目表student_study 注意&#xff1a;科目kemu列内容是字典码&#xff0c;需要更换成对应内容。 CREATE TABLE "TEST"."STUDENT_STUDY" ( "NAME" VARCHAR(2…

mysql redis的区别

.mysql和redis的数据库类型 mysql是关系型数据库&#xff0c;主要用于存放持久化数据&#xff0c;将数据存储在硬盘中&#xff0c;读取速度较慢。 redis是NOSQL&#xff0c;即非关系型数据库&#xff0c;也是缓存数据库&#xff0c;即将数据存储在缓存中&#xff0c;缓存的读取…

v-model绑定导致的element UI文本框输入第一次值后被绑定,导致空文本框无法再输入文字

在工作岗位上&#xff0c;上边分配一个任务&#xff0c;创建一个页面&#xff0c;从0-1&#xff0c;全部自己搭建&#xff0c;也没有啥模版&#xff0c;就这么来&#xff0c;那就直接来吧&#xff0c;没办法&#xff0c;那就直接上手&#xff0c;开发过程中&#xff0c;我使用了…

Verdi实现信号的平移

在Verilog/System verilog中&#xff0c;# xxx可以实现延迟指定时间的功能&#xff0c;而在使用verdi查看信号波形并进行分析时&#xff0c;同样也可以实现类似的功能。 (注&#xff1a;这种信号平移是有其应用场景的&#xff0c;例如&#xff0c;在某些仿真模型中&#xff0c;…