责任链设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.责任链模式 2.什么是责任链模式 3.落实责任链 4.何时使用责任链模式 5. JDK中的责任链 6.下载源代码

1.责任链模式

责任链模式是一种行为模式,其中一组对象按顺序链接在一起,并提供一个责任(请求)以便由该组进行处理。 如果组中的对象可以处理特定的请求,它可以处理并返回相应的响应。 否则,它将请求转发到组中的后续对象。

对于现实生活中的场景,为了理解这种模式,假设您有一个要解决的问题。 如果您能够自己处理,则可以这样做,否则您将告诉您的朋友解决该问题。 如果他能够解决,那么他会做到,或者还将其转发给其他朋友。 该问题将被转发,直到您的一个朋友解决了该问题,或者您的所有朋友都看到了问题,但是没有人能够解决它,在这种情况下,问题仍然没有解决。

让我们解决一个现实生活中的场景。 您的公司已获得一份合同,向一家卫生公司提供分析应用程序。 该应用程序将告诉用户特定的健康问题,其病史,治疗方法,药物,对患有该疾病的人的采访等,以及了解该疾病所需要的一切。 为此,您的公司会收到大量数据。 数据可以是任何格式,可以是文本文件,doc文件,excel,音频,图像,视频,以及任何您能想到的东西。

现在,您的工作就是将这些数据保存在公司的数据库中。 用户将以任何格式提供数据,并且您应该为他们提供一个界面,以将数据上传到数据库中。 用户对了解如何保存不同的非结构化数据不感兴趣,甚至不知道。

这里的问题是您需要开发不同的处理程序以保存各种格式的数据。 例如,文本文件保存处理程序不知道如何保存mp3文件。

要解决此问题,您可以使用“责任链”设计模式。 您可以创建不同的对象,以处理不同的数据格式并将它们链接在一起。 当请求到达单个对象时,它将检查是否可以处理和处理特定的文件格式。 如果可以,它将进行处理。 否则,它将转发到链接到它的下一个对象。 这种设计模式还使用户与正在处理请求的对象脱钩。 用户不知道哪个对象实际上正在为其请求提供服务。

解决问题之前,首先让我们进一步了解责任链设计模式。

2.什么是责任链模式

这种模式的目的是通过给多个对象一个处理请求的机会,避免将请求的发送者耦合到其接收者。 我们将接收的对象链接起来,并将请求沿着链接传递,直到一个对象处理它为止。

这种模式是关于在通知链中连接对象的。 当通知沿链传送时,它由设置为处理特定通知的第一个对象处理。

当有多个对象可以处理或满足客户请求时,该模式建议为这些对象中的每一个提供按顺序处理请求的机会。 在这种情况下应用模式,这些潜在处理程序中的每一个都可以以链的形式排列,每个对象都引用链中的下一个对象。 链中的第一个对象接收请求,并决定处理该请求或将其传递给链中的下一个对象。 该请求一个接一个地流经链中的所有对象,直到该请求由链中的一个处理程序处理,或者该请求到达链的末尾而没有得到处理。

图1

图1

处理程序

  1. 定义用于处理请求的接口。
  2. (可选)实现后继链接。

混凝土处理机

  1. 处理要求它负责的请求。
  2. 可以访问其后继者。
  3. 如果ConcreteHandler可以处理请求,则可以处理; 否则,它将请求转发给其后继者。

客户

  1. 向链上的ConcreteHandler对象发起请求。

当客户端发出请求时,请求将沿着链传播,直到ConcreteHandler对象负责处理该请求。

3.落实责任链

为了实现责任链以解决上述问题,我们将创建一个接口Handler。

package com.javacodegeeks.patterns.chainofresponsibility;public interface Handler {public void setHandler(Handler handler);public void process(File file);public String getHandlerName();
}

上面的接口包含两个主要方法, setHandler和process方法。 setHandler用于设置链中的下一个处理程序。 仅当处理程序能够处理请求时,才使用process方法处理请求。 (可选)我们具有getHandlerName方法,该方法用于返回处理程序的名称。

处理程序旨在处理包含数据的文件。 具体的处理程序通过检查文件类型来检查是否能够处理文件,否则转发到链中的下一个处理程序。

File类如下所示。

package com.javacodegeeks.patterns.chainofresponsibility;public class File {private final String fileName;private final String fileType;private final String filePath;public File(String fileName, String fileType, String filePath){this.fileName = fileName;this.fileType = fileType;this.filePath = filePath;}public String getFileName() {return fileName;}public String getFileType() {return fileType;}public String getFilePath() {return filePath;}}

File类创建简单的文件对象,其中包含文件名,文件类型和文件路径。 处理程序将使用文件类型来检查文件是否可以被处理程序处理。 如果处理程序可以,它将处理并保存它,或者将其转发到链中的下一个处理程序。

现在让我们来看一些具体的处理程序。

package com.javacodegeeks.patterns.chainofresponsibility;public class TextFileHandler implements Handler {private Handler handler;private String handlerName;public TextFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("text")){System.out.println("Process and saving text file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}
}

TextFileHandler用于处理文本文件。 它实现Handler接口并覆盖其三个方法。 它拥有对链中下一个处理程序的引用。 在process方法中,它检查文件类型是否为文本,对其进行处理或将其转发给下一个处理程序。

其他处理程序与上述处理程序类似。

package com.javacodegeeks.patterns.chainofresponsibility;public class DocFileHandler implements Handler{private Handler handler;private String handlerName;public DocFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("doc")){System.out.println("Process and saving doc file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class AudioFileHandler implements Handler {private Handler handler;private String handlerName;public AudioFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("audio")){System.out.println("Process and saving audio file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class ExcelFileHandler implements Handler{private Handler handler;private String handlerName;public ExcelFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("excel")){System.out.println("Process and saving excel file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}
}package com.javacodegeeks.patterns.chainofresponsibility;public class ImageFileHandler implements Handler {private Handler handler;private String handlerName;public ImageFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("image")){System.out.println("Process and saving image file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}}package com.javacodegeeks.patterns.chainofresponsibility;public class VideoFileHandler implements Handler {private Handler handler;private String handlerName;public VideoFileHandler(String handlerName){this.handlerName = handlerName;}@Overridepublic void setHandler(Handler handler) {this.handler = handler;}@Overridepublic void process(File file) {if(file.getFileType().equals("video")){System.out.println("Process and saving video file... by "+handlerName);}else if(handler!=null){System.out.println(handlerName+" fowards request to "+handler.getHandlerName());handler.process(file);}else{System.out.println("File not supported");}}@Overridepublic String getHandlerName() {return handlerName;}
}

现在,让我们测试上面的代码。

package com.javacodegeeks.patterns.chainofresponsibility;public class TestChainofResponsibility {public static void main(String[] args) {File file = null;Handler textHandler = new TextFileHandler("Text Handler");Handler docHandler = new DocFileHandler("Doc Handler");Handler excelHandler = new ExcelFileHandler("Excel Handler");Handler audioHandler = new AudioFileHandler("Audio Handler");Handler videoHandler = new VideoFileHandler("Video Handler");Handler imageHandler = new ImageFileHandler("Image Handler");textHandler.setHandler(docHandler);docHandler.setHandler(excelHandler);excelHandler.setHandler(audioHandler);audioHandler.setHandler(videoHandler);videoHandler.setHandler(imageHandler);file = new File("Abc.mp3", "audio", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.jpg", "video", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.doc", "doc", "C:");textHandler.process(file);System.out.println("---------------------------------");file = new File("Abc.bat", "bat", "C:");textHandler.process(file);}}

上面的程序将具有以下输出。

Text Handler fowards request to Doc Handler
Doc Handler fowards request to Excel Handler
Excel Handler fowards request to Audio Handler
Process and saving audio file... by Audio Handler
---------------------------------
Text Handler fowards request to Doc Handler
Doc Handler fowards request to Excel Handler
Excel Handler fowards request to Audio Handler
Audio Handler fowards request to Video Handler
Process and saving video file... by Video Handler
---------------------------------
Text Handler fowards request to Doc Handler
Process and saving doc file... by Doc Handler
---------------------------------
Text Handler fowards request to Doc Handler
Doc Handler fowards request to Excel Handler
Excel Handler fowards request to Audio Handler
Audio Handler fowards request to Video Handler
Video Handler fowards request to Image Handler
File not supported

在上面的示例中,首先我们创建了不同的处理程序并将它们链接在一起。 该链从用于处理文本文件的文本处理程序开始,一直到文档处理程序等等,直到最后一个处理程序即图像处理程序。

然后,我们创建了不同的文件对象,并将其传递给文本处理程序。 如果文件可以由文本处理程序处理,则执行该操作,否则将文件转发到下一个链接的处理程序。 您可以在输出中看到链接的对象如何转发请求的文件,直到到达适当的处理程序为止。

另外,请注意,我们尚未创建处理程序来处理bat文件。 因此,它通过所有处理程序并产生输出–“不支持文件”。

客户端代码与提供的对象分离。 它仅发送请求,并且该请求由链中的任何处理程序处理,或者在有支持的情况下不进行处理。

4.何时使用责任链模式

在以下情况下使用责任链

  1. 多个对象可以处理一个请求,并且处理程序不是先验的。 处理程序应自动确定。
  2. 您要向多个对象之一发出请求,而无需显式指定接收者。
  3. 应该动态指定可以处理请求的对象集。

5. JDK中的责任链

以下是Java中的责任链模式的用法。

  1. java.util.logging.Logger#log()
  2. javax.servlet.Filter#doFilter()

6.下载源代码

这是“责任链模式”的一课。 您可以在此处下载源代码: ChainofResponsibility-Project

翻译自: https://www.javacodegeeks.com/2015/09/chain-of-responsibility-design-pattern-2.html

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

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

相关文章

使用JUnit规则进行干净的集成测试

JUnit Rules的优势,尤其是在进行集成测试时,几乎不能被高估。 在本文中,我们将阐明ExternalResource扩展的有用性。 在我们必须使用抽象外部资源的第三方库的情况下,这些简化了灯具控制。 作为示例,我们将看看如何基于…

winform基础窗体设置及基础控件

WinForm - 也叫做C/S 客户端 另:B/S是 网页端 客户端应用程序 - 是需要安装在用户电脑上才可以使用的程序 特点: 不需要联网也可以打开使用部分功能,但是现在的情况是许多功能依然需要互联网的支持,代码部分在用户电脑上执行 使用…

【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境 SSH&#xff0c;EasyUI&#xff0c;MySQL 1、需求要求&#xff1a; (1)首先获取所有的贷款订单数据&#xff0c;即List <LoanOrder>。 (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 2、实体之间的关系描述 (1)LoanOrder实体与Loaner…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…

OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中&#xff0c;我们使用了以下OpenMap类&#x…

java rx.observable_Rxjava2 Observable的条件操作符详解及实例

简要&#xff1a;需求了解&#xff1a;在使用 Rxjava 开发中&#xff0c;经常有一些各种条件的操作 &#xff0c;如比较两个 Observable 谁先发射了数据、跳过指定条件的 Observable 等一系列的条件操作需求&#xff0c;那么很幸运&#xff0c; Rxjava 中已经有了很多条件操作符…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…

hprof 不大 泄露_HPROF –内存泄漏分析教程

hprof 不大 泄露本文将为您提供有关如何通过生成和分析Sun HotSpot JVM HPROF堆转储文件来分析JVM内存泄漏问题的教程。 一个现实的案例研究将用于此目的&#xff1a;Weblogic 9.2内存泄漏影响Weblogic Admin服务器。 环境规格 Java EE服务器&#xff1a;Oracle Weblogic Ser…

投资银行对Java进行的二十大核心面试问答

这是在金融领域&#xff08;主要是大型投资银行&#xff09;共享Java核心访谈问题和答案的新系列。 在JP Morgan&#xff0c;Morgan Stanley&#xff0c;Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 &#xff0c; 集合 &#xff0c;序列化&#xff…

java 支付重复问题_Airbnb支付系统如何在分布式环境下避免重复打款

原文链接&#xff1a;https://medium.com/airbnb-engineering/avoiding-double-payments-in-a-distributed-payments-system-2981f6b070bbAirbnb一直在将其基础架构迁移到面向服务的体系结构(SOA)。 SOA具有许多优势&#xff0c;例如使开发人员能够专业化并具有更快迭代的能力。…

myeclipse配置java8_MyEclipse 2017配置Tomcat8

MyEclipse 2017的配置其实跟MyEclipse 2015的比较一致&#xff0c;再往之前的就有出入了。不得不吐槽其卡&#xff0c;跟Eclipse不在一个量级上呀。。。一、配置转自&#xff1a;http://www.xuexila.com/diannao/diy/2788109.html工具/原料myeclipse 2017tomcat8 服务器方法/步…

MySQL在Django框架下的基本操作(MySQL在Linux下配置)

注&#xff1a;本文已迁移至CSDN&#xff0c;后续的更新也会在CSDN。 http://blog.csdn.net/houchaoqun_xmu/article/details/53813633 http://blog.csdn.net/houchaoqun_xmu 【原】本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作&#xff0c;核心内容如下&#x…

Clean Sheet – Windows 10的人体工程学Eclipse主题

Clean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净&#xff0c;低眩光的外观和感觉&#xff0c;旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择&#xff0c;可以突出谐波语法并注重可读性。 除自定义滚动条外&#xff0c;它还努力满足现代美学要…

CentOS上安装MyCat-MySQL

1、安装JDK&#xff0c;要求JDK7以上。 2、下载MyCat&#xff0c;地址。 3、解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz&#xff0c;到usr/local/Mycat目录下。 4、添加用户Mycat。 [rootlocalhost Desktop]# useradd Mycat [rootlocalhost Desktop]# passwd M…

Java中的Redis的思维导图_Redis思维导图

常见相关问题Redis 有哪些功能&#xff1f;数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列Redis 为什么是单线程的&#xff1f;因为 cpu 不是 Redis 的瓶颈&#xff0c;Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现&#xff0c;而且 cpu 又…

在Java EE应用程序中实现自动重试

最初&#xff0c;我想将此博客称为“ 具有拦截器驱动的重试策略的灵活超时 ”&#xff0c;但后来我认为它太“繁重”。 该声明以及修改后的标题应该&#xff08;希望&#xff09;使您了解此帖子可能谈论的内容;-) 触发 这篇文章主要由我在较早的一篇文章中收到的评论/问题之一…

2016-12-17 新浪博客服务器挂掉了,所有博客页面都无法打开

今天&#xff08;2016-12-17 10:20&#xff09;早晨从百度上检索到一篇新浪博客文章&#xff0c;点进去之后显示无法访问此网址&#xff0c;如下截图 去新浪博客主页看了看&#xff0c;主页是可以打开的 但是点进去任何一篇文章&#xff0c;都无法打开此页面 应该是新浪博客的服…