设计模式示例_责任链设计模式示例

设计模式示例

本文是我们名为“ 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/336798.shtml

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

相关文章

edmonds算法matlab,匈牙利算法的matlab实现

匈牙利算法算法简介算法原理算法实现(附代码)测试算法简介下面摘用百度百科中的解释。匈牙利算法(Hungarian method)是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是二分图匹配最常见的算法&#xff0c…

java jooq_将Java EE与jOOQ结合使用的初学者指南

java jooqJava EE附带了自己的持久性API:JPA。 当您想要将RDBMS实体(表/关系)映射到Java实体(类)时,JPA最强大,主要遵循1:1映射策略。 其背后的思想是,业务逻辑通常不像关…

php扩展 waf,基于PHP扩展的WAF实现

访问一下看看结果:可以看到ls命令成功的执行了,也就是说我们的正常文件是不会被拦截的,而只有upload目录中的文件会被拦截,这样做又会引发另一个弊端,倘若攻击者通过某种方法将shell写入正常的文件中,或是与…

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

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

多项式在matlab中的应用,matlab的应用-多项式函数及多项式拟合

matlab的应用-多项式函数及多项式拟合 Matlab 的应用- 多项式函数及多项式拟合 本节将向大家简要介绍 matlab 在多项式处理方面的应用。 多项式函数主要有: roots 求多项式的根 poly 特征多项式 polyval 多 项式的计算 poly2str(p, x )多项式代换 polyfit 多项式曲线…

乐惠科技php面试题,程序员中的奇葩,使用php构建魔兽世界

这是用PHP编写的魔兽世界服务器。现在它已经调试了登录服务器的过程。目前的魔兽世界客户端是2.4.3_8606。服务器列表和帐户密码数据需要查询AUTH库。世界服务器身份验证过程已完成,数据包加密已完成后续进程正在开发中......数据库文件在根目录: sql/sql.7z今天在群…

javafx窗体程序_JavaFX真实世界应用程序:EIZO CuratOR Caliop

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

java8 streams_Java 8 Streams:过滤和谓词否定

java8 streams最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结。 讨论是关于使用.filter和否定谓词的方法。 这篇文章的代码可以在我的github帐户中找到 。 也许这就是您可能会想到的方式&…

hystrix熔断 简介_Hystrix简介– Hello World

hystrix熔断 简介在以前的博客文章中,我介绍了需要像Netflix Hystrix这样的库的动机。 在这里,我将跳入一些非常基本的方法来开始使用Hystrix,并在更复杂的用例中进行跟进。 你好,世界 以下是“ Hystrix命令”的一个简单的Hello …

php中哪个函数用于读取文件,PHP内置函数fget读取文件

php fgets()函数从文件指针读取一行语法:fgets(file,length)参数说明必需的. 指定姚要读取的文件长度可选. 指定姚都区的字节数. 默认值为102字节从文件所指向的文件中读取一行,并返回最大长度为1个字节的字符串. 遇到换行符(包含在返回值中,)&#xff0…

c++返回指针时候注意提防_提防Java中的函数式编程!

c返回指针时候注意提防这对函数式编程并不会造成太大的影响,这真棒。 这是关于某些实践的警告,您很可能会将其应用于您的代码,而这是完全错误的! 。 高阶函数对于函数式编程是必不可少的,因此,谈论它们将帮…

centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

|CentOS环境下给PHP7.0安装yaf扩展在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下。下一步需要下载扩展包,进入http://pecl.php.net/package/yaf寻找符合版本要求的…

jsf教程_JSF范围教程– JSF / CDI会话范围

jsf教程会话作用域跨越多个HTTP请求-响应周期(理论上是无限的)。 当您需要每个HTTP请求-响应周期进行一次交互时,请求作用域在任何Web应用程序中都非常有用。 但是,当您需要对属于用户会话的任何HTTP请求-响应周期可见的对象时&…

linux查询设备文件信息失败怎么办,Linux下使用blkid命令查询设备及文件系统信息的方法...

在Linux下可以使用blkid命令对查询设备上所采用文件系统类型进行查询。blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询。要使用这个命令必须安装e2fsprogs软件包。直接使用blkid可列出当前系统中所以已挂载文件系统的类型。默认情…

linux rpm mysql mysql_config,Linux CentOS6 mysql rpm安装

选择操作系统及版本:点击5.6版本链接将下载好的文件上传至服务器下面开始安装:检查是是否有mysql的包# rpm -qa | grep -i mysql删除原有包# yum -y remove mysql-libs*开始安装下载好的三个文件:# rpm -ivh MySQL-server-5.6.38-1.el6.x86_6…

java 可视化_可视化Java 9模块关系

java 可视化正如我在之前的文章中所述 ,我已经在Java 9 Jigsaw构建上运行Eclipse Neon了一段时间,并且没有任何问题。 我在周末花了几个小时来修改一些模块化工具的想法。 我为Eclipse Neon写了一个小插件,可视化了各个模块之间的连接。 现…

zybo的linux开发教程,Zybo全栈开发入门教程——连载三:创建Linux设备驱动和应用程序...

作者:Commanderfranz,编译: kenshin通过前面两篇文章我们不仅创建的自定义IP模块还移植了Linux操作系统,今天这篇文章的内容是将这两部分联系起来,其实我们创建的myLed IP相对于Linux操作系统可以是它的一个底层设备&a…

linux 二进制差分工具,打造Android万能的软件更新库

今日科技快讯阿里星球今天在苹果商店发布的更新动态显示,其将在近期停止APP内的音乐服务,用户可以通过新版本内的指引和说明,导出本地音乐。这意味着上线八个月后,阿里星球做出了一个重大决定:停止音乐服务后&#xff…

lambda 分类聚合_使用Java 8 Lambda,流和聚合

lambda 分类聚合总览 在本文中,我们将介绍使用Java 8 lambda,流和聚合来过滤和处理Collection中的对象。 这篇文章中的所有代码都可以在此处的 BitBucket中找到 。 对于此示例,我们将创建许多对象,这些对象代表我们IT基础架构中的…

linux镜像文件不要大于4g,Systemback制做大于4G的Ubuntu系统镜像

1 安装Systemback依此执行以下命令。sudo apt-get updatesudo add-apt-repository ppa:nemh/systembacksudo apt-get update && sudo apt-get install systemback unionfs-fuse安装完成:2 使用Systemback生成镜像文件输入管理员密码,打开后界面以…