java责任链模式

java责任链模式使多个对象都有机会处理请求 从而避免了请求的发送者和接收者之间的耦合关系 将这些对象连成一条链 并沿着这条链传递该请求 直到有对象处理它为止

定义:

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

优点: 

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

缺点:

 1、不能保证请求一定被接收。

2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。

3、可能不容易观察运行时的特征,有碍于除错

适用场景:

就像开始的例子那样,假如使用if…else…语句来组织一个责任链时感到力不从心,代码看上去很糟糕时,就可以使用责任链模式来进行重构。

实现代码:

package chainOfResponsibility; public class ChainOfResponsibilityPattern { public static void main(String[] args) { //组装责任链 Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); handler1.setNext(handler2); //提交请求 handler1.handleRequest("two"); } } //抽象处理者角色 abstract class Handler { private Handler next; public void setNext(Handler next) { this.next=next; } public Handler getNext() { return next; } //处理请求的方法 public abstract void handleRequest(String request); } //具体处理者角色1 class ConcreteHandler1 extends Handler { public void handleRequest(String request) { if(request.equals("one")) { System.out.println("具体处理者1负责处理该请求!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } } //具体处理者角色2 class ConcreteHandler2 extends Handler { public void handleRequest(String request) { if(request.equals("two")) { System.out.println("具体处理者2负责处理该请求!"); } else { if(getNext()!=null) { getNext().handleRequest(request); } else { System.out.println("没有人处理该请求!"); } } } }

模式的扩展

职责链模式存在以下两种情况:

  1. 纯的职责链模式:一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理(承担责任);把责任推给下家处理。
  2. 不纯的职责链模式:允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况,且一个请求可以最终不被任何接收端对象所接收。

总结

责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中,这样做的优点是比较灵活了,但同样也带来了风险,比如设置处理类前后关系时,一定要特别仔细,搞对处理类前后逻辑的条件判断关系,并且注意不要在链中出现循环引用的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220237.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:55
下一篇 2026年3月17日 下午8:56


相关推荐

  • c和java的区别_java与c的区别

    c和java的区别_java与c的区别Java和C都是指令式语言(ImperativeLanguage),不同的是Java有面向对象(OO)成分在里面,而C是完全面向过程的,C的高级版本C++、C#支持面向对象。另外一个不同是,Java跨平台,既不同的操作系统都可以通过JVM来解释Java程序,而C、C++、C#则是与平台相关的,有些指令只在某些操作系统中才能执行。(推荐学习:java课程)具体原因是,Java是解释型语…

    2022年7月8日
    24
  • Java多维数组声明格式

    Java多维数组声明格式刷题目再次遇到了声明这种最基本形式的考题,以此记录,共勉。关于多维数组声明的形式你知道哪几种呢?首先先上一个错误的例子:这里arr9-arr11在等式右边都错误的在中括号中加了数组大小,导致报错;而arr11、arr12则是等式右边二维数组初始化时没有赋予初始大小导致报错。正确的声明形式如下:本质上arr0、arr4和arr3、arr8是一样的;而arr1-2和arr5-…

    2022年5月5日
    42
  • PyQuery 库

    PyQuery 库强大又灵活的网页解析库。如果你觉得正则写起来太麻烦,BearutifulSoup语法太难记,而又熟悉jQuery的语法,那么PyQuery就是你的绝佳选择1、初始化1.1、字符串初始化html="""<div><ul><liclass="item-0">firstitem</li>

    2022年5月18日
    45
  • 考考基础部分,谈谈Java集合中HashSet的原理及常用方法

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:工匠初心cnblogs.com/LiaHon/p/11257805.html 目录 HashSet概述 Has…

    2021年6月24日
    92
  • r语言ggplot回归分析图_R如何导入数据

    r语言ggplot回归分析图_R如何导入数据#第一章R基础install.packages(c("ggplot2","gcookbook"))library(ggplot2)library(gcookbook)#加载分隔符式的文本文件#data<-read.csv("datafile.csv")#data<-read.csv("datafile.csv",header=FALSE)#手动为列名赋值#name…

    2022年10月3日
    3
  • Spring Boot第八章-非关系型数据库(MongoDB,Redis)

    Spring Boot第八章-非关系型数据库(MongoDB,Redis)

    2021年5月16日
    196

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号