23种设计模式(19)java责任链模式

java 中的设计模式 通常,一个设计模式描述了一个被证明可行的方案。这些方案非常广泛,是具有完整定义的最常用的行式。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。 阅读详情

23种设计模式(19)java责任链模式

 更新时间:2018年01月27日 10:03:12   作者:Java知音    我要评论

 

这篇文章主要为大家详细介绍了23种设计模式之java责任链模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

23种设计模式第十九篇:java责任链模式

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

类型:行为类模式

类图:

首先来看一段代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

public void test(int i, Request request){

  if(i==1){

    Handler1.response(request);

  }else if(i == 2){

    Handler2.response(request);

  }else if(i == 3){

    Handler3.response(request);

  }else if(i == 4){

    Handler4.response(request);

  }else{

    Handler5.response(request);

  }

}

代码的业务逻辑是这样的,方法有两个参数:整数i和一个请求request,根据i的值来决定由谁来处理request,如果i==1,由Handler1来处理,如果i==2,由Handler2来处理,以此类推。

在编程中,这种处理业务的方法非常常见,所有处理请求的类有if…else…条件判断语句连成一条责任链来对请求进行处理,相信大家都经常用到。这种方法的优点是非常直观,简单明了,并且比较容易维护,但是这种方法也存在着几个比较令人头疼的问题:

代码臃肿:实际应用中的判定条件通常不是这么简单地判断是否为1或者是否为2,也许需要复杂的计算,也许需要查询数据库等等,这就会有很多额外的代码,如果判断条件再比较多,那么这个if…else…语句基本上就没法看了。

耦合度高:如果我们想继续添加处理请求的类,那么就要继续添加else if判定条件;另外,这个条件判定的顺序也是写死的,如果想改变顺序,那么也只能修改这个条件语句。

        既然缺点我们已经清楚了,就要想办法来解决。这个场景的业务逻辑很简单:如果满足条件1,则由Handler1来处理,不满足则向下传递;如果满足条件2,则由Handler2来处理,不满足则继续向下传递,以此类推,直到条件结束。其实改进的方法也很简单,就是把判定条件的部分放到处理类中,这就是责任连模式的原理。

责任链模式的结构

        责任链模式的类图非常简单,它由一个抽象地处理类和它的一组实现类组成:
抽象处理类:抽象处理类中主要包含一个指向下一处理类的成员变量nextHandler和一个处理请求的方法handRequest,handRequest方法的主要主要思想是,如果满足处理的条件,则有本处理类来进行处理,否则由nextHandler来处理。
具体处理类:具体处理类主要是对具体的处理逻辑和处理的适用条件进行实现。

了解了责任链模式的大体思想之后,再看代码就比较好理解了:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

class Level {

    private int level = 0;

    public Level(int level){

      this.level = level;

    };

      

    public boolean above(Level level){

      if(this.level >= level.level){

        return true;

      }

      return false;

    }

  }

    

  class Request {

    Level level;

    public Request(Level level){

      this.level = level;

    }

      

    public Level getLevel(){

      return level;

    }

  }

    

  class Response {

    

  }

    

  abstract class Handler {

    private Handler nextHandler;  

    public final Response handleRequest(Request request){

      Response response = null;

        

      if(this.getHandlerLevel().above(request.getLevel())){

        response = this.response(request);

      }else{

        if(this.nextHandler != null){

          this.nextHandler.handleRequest(request);

        }else{

          System.out.println("-----没有合适的处理器-----");

        }

      }

      return response;

    }

    public void setNextHandler(Handler handler){

      this.nextHandler = handler;

    }

    protected abstract Level getHandlerLevel();

    public abstract Response response(Request request);

  }

    

  class ConcreteHandler1 extends Handler {

    protected Level getHandlerLevel() {

      return new Level(1);

    }

    public Response response(Request request) {

      System.out.println("-----请求由处理器1进行处理-----");

      return null;

    }

  }

    

  class ConcreteHandler2 extends Handler {

    protected Level getHandlerLevel() {

      return new Level(3);

    }

    public Response response(Request request) {

      System.out.println("-----请求由处理器2进行处理-----");

      return null;

    }

  }

    

  class ConcreteHandler3 extends Handler {

    protected Level getHandlerLevel() {

      return new Level(5);

    }

    public Response response(Request request) {

      System.out.println("-----请求由处理器3进行处理-----");

      return null;

    }

  }

    

  public class Client {

    public static void main(String[] args){

      Handler handler1 = new ConcreteHandler1();

      Handler handler2 = new ConcreteHandler2();

      Handler handler3 = new ConcreteHandler3();

    

      handler1.setNextHandler(handler2);

      handler2.setNextHandler(handler3);

        

      Response response = handler1.handleRequest(new Request(new Level(4)));

    }

  }

代码中Level类是模拟判定条件;Request,Response分别对应请求和响应;抽象类Handler中主要进行条件的判断,这里模拟一个处理等级,只有处理类的处理等级高于Request的等级才能处理,否则交给下一个处理者处理。

在Client类中设置好链的前后执行关系,执行时将请求交给第一个处理类,这就是责任链模式,它完成的功能与前文中的if…else…语句是一样的。

责任链模式的优缺点

        责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。责任链模式也有缺点,这与if…else…语句的缺点是一样的,那就是在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严重。

责任链模式的适用场景

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

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

23 种设计模式 Java 实现:分类解析与代码示例 远程代理(RPC)、虚拟代理(图片懒加载)、保护代理(权限控制)。:定义对象间的一对多依赖,当一个对象状态变化时,通知所有依赖者。:将复杂对象的构建与表示分离,允许相同构建过程创建不同表示。:将对象组合成树形结构,统一处理单个对象和组合对象。:根据不同条件创建不同类型的对象(如文件解析器)。:大量相似对象(如文本编辑器中的字符、围棋棋子)。:将请求封装为对象,支持请求的参数化、排队和撤销。:提供创建一系列相关对象的接口,无需指定具体类。:通过复制现有对象创建新对象,避免重复初始化。 阅读详情

相关推荐

CDH Hue连接Hbase报错TSocket read 0 bytes

问题描述 安装好CDH集群后,在Hue中查看HBase信息时,Hue界面报错如下: Api 错误:TSocket read 0 bytes Hue日志报错: exceptions_renderable ERROR Potential trace: [('/opt/cloudera/parcels/CDH-6.3.2-1.cdh6.3.2.p0.1605554/lib/hue/apps/hbase/src/hbase/api.py', 46, 'query', 'return getattr(self

邢为栋 3492

Java设计模式总结篇:七大原则以及23种设计模式简单介绍

主要介绍七大原则和23种设计模式 原则:1、单一原则2、开闭原则3、里氏替换原则4、接口隔离原则5、依赖倒置原则6、迪米特法则7、合成复用原则 设计模式:1、单例模式2、工厂模式3、抽象工厂模式4、原型模式5、建造者模式6、适配者模式7、桥连模式8、装饰者模式9、享元模式10、代理模式11、组合模式12、外观模式13、状态模式14、责任链模式15、迭代器模式16、观察者模式17、策略模式18、模板方法模式19、解释器模式20、中介者模式21、备忘录模式22、命令模式23、访问者模式

小庄的博客 3546

Cursor聊天记录迁移工具:实现跨设备AI对话同步与备份

在软件开发中,数据持久化与迁移是常见需求,尤其当工具依赖本地存储时。SQLite作为轻量级关系型数据库,因其嵌入式、零配置特性,常被用于存储应用状态与用户数据。其WAL(预写式日志)模式提升了并发性能,但也增加了数据操作复杂性。通过命令行工具与JSON序列化技术,可以实现结构化数据的提取、转换与安全迁移,这对于保障开发资产的连续性与可移植性具有重要价值。例如,在AI辅助编程场景下,开发者与AI的对话记录包含关键的问题分析、解决方案与决策逻辑,是重要的上下文资产。cursor-chat-transfer工具正

weixin_42551967的博客 533

史上最全--23种设计模式全解析

目录 一、设计模式的分类 二、设计模式的六大原则 总原则:开闭原则(Open Close Principle) 1、单一职责原则 2、里氏替换原则(Liskov Substitution Principle) 3、依赖倒转原则(Dependence Inversion Principle) 4、接口隔离原则(Interface Segregation Principle) 5...

不二的博客 8514

安卓逆向实战:用Batch Apktool 3.8.0快速汉化APK的完整流程

本文详细解析了如何使用Batch Apktool 3.8.0进行安卓APK汉化的完整流程,包括环境配置、反编译、资源解析、深度汉化、重构建与签名优化等关键步骤。通过这款集成化逆向工具,开发者可以高效完成APK汉化,提升工作效率。

s1t2u3的博客 1099

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析

本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。

weixin_28481133的博客 368

【JAVA】23种设计模式

什么是设计模式?设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

fearless的博客 1517

innovus 命令每日精要 | 掌控Innovus布线的利器——setNanoRouteMode详解

在数字IC后端设计的复杂世界里,布线优化是至关重要的一步。今天,我来给大家深入讲解Innovus工具中setNanoRouteMode命令的精妙之处,让你轻松驾驭布线策略,提升设计质量。setNanoRouteMode是Innovus中用于配置NanoRoute绕线行为的关键命令。通过其丰富的参数,你可以精细控制布局后阶段的绕线策略、信号完整性优化、工艺适配及设计规则修复等流程。下面,我将按功能分类总结其核心选项,并针对不同场景给出建议。

weixin_50820814的博客 3528

Java设计模式:23种设计模式全面解析(超级详细)

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。 ...

wenjianfeng的专栏 5970

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

【数据集】全球首个10米分辨率精细分类土地覆盖数据集GLC_FCS10

WW、forever的博客 1567

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 252

23种设计模式UML图

设计模式UML图 创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

是小光a~ 9131

Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍

下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua...

腿足机器人领域 1677

Java中的23种设计模式,你get到了吗?

Java中23种设计模式详解1、抽象工厂模式(Abstract Factory):2、适配器模式(Adapter):3、桥梁模式(Bridge):4、建造模式(Builder):5、责任链模式(Chain of Responsibility):6、命令模式(Command):7、合成模式(Composite):8、装饰模式(Decorator):9、门面模式(Facade):10、工厂方法(Fac...

程序羊的博客 2726

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

简单玩转23种Java设计模式

什么是设计模式 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码...

潘建南的博客 7148

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

津津乐道设计模式 - 责任链模式详解(教你更优雅的处理商城下单业务)

本章节主要介绍了责任链模式、责任链模式适用场景、责任链模式的优缺点,并以商场系统下单验证的场景模拟责任链模式的使用方法,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

Micro麦可乐的博客 1万+

不愧是清华大佬,一个联机对战游戏就把23种设计模式给抽丝剥茧了

金三银四马上就到了,希望大家能好好学习一下这些技术点学习视频:《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />金三银四马上就到了,希望大家能好好学习一下这些技术点学习视频:[外链图片转存中…(img-EzgfpyCS-1712269719015)]大厂面试真题:[外链图片转存中…(img-ThJUXhlf-1712269719016)]《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

shenliba的博客 927

JAVA设计模式总结之23种设计模式(重点!!!)

JAVA设计模式总结之23种设计模式:一、什么是设计模式设计模式遵循的原则有6个:二、设计模式的三个分类三、各分类中模式的关键点四、概说23种设计模式1.单例模式(Singleton)2.工厂方法模式(Factory Method)3.抽象工厂模式 (Abstract Factory)4.建造者模式(Builder)5.原型模式 (Protype)6.适配器模式 (Adapter)7.桥接模式8.组合模式9.装饰模式10.外观模式11.亨元模式12.代理模式13.访问者模式14.模板模式15.策略模式16

LonE li 2070

23 种设计模式(Java代码演示版)

23 种设计模式集合(7万字长文-Java代码演示版)

RichardGeek的博客 6964

Java 23种设计模式

Java 设计模式(疯狂Java 联盟版) 1 目录 1. 设计模式..........................................................................................................................................3 1.1 创建型模式.............

Freda的专栏 1777

Java设计模式(23种详细介绍)

Java设计模式(23种详细介绍),有代码示例。

weixin_59385556的博客 2735

java23种设计模式一(连载)

设计模式概要 设计模式,顾名思义,它是一种模式,在面向对象中,它运用类与它们的方法来达到目标。使用它便于代码的可重用和可读性,有利于系统的维护。《Design pattern》一书中首次提出了23种设计模式,倘若你想成为编程高手,就必须要学习设计模式。 以下...

chongsi9495的博客 135

Java23种设计模式简介

Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、责任链模式。 1、抽象工厂模式是提供一个接口,用于创建相关或者依赖对象的家族,而不需要明确指定具体类。 2、建造模式是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 3、工厂方法模式定义一个创建对象的接口,

Alzqlzq的博客 2309

【23】种设计模式全面解析(超级详细)

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995 年,GoF(Gang of Four,四人组/四人帮)合作出版了《设计模式:可复用面向对象软件的基础》一书,共收录了 23 种设计模式,从此树立了软件设计模式领域的里程碑,人称「GoF设计模式」。 这 23 种设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性,以及类的关联.

天道·乾坤 的博客 4626

一文搞懂23种Java设计模式

本文介绍了Java设计模式的三大类(创建型、结构型、行为型)共23种模式,重点标注了高频使用的9种模式。创建型模式包括单例、工厂方法、抽象工厂、建造者和原型模式;结构型模式涵盖适配器、装饰器和代理模式等。每种模式均给出定义、适用场景及代码示例,如单例模式的饿汉/懒汉实现、工厂方法模式的产品创建解耦等,帮助开发者理解如何通过设计模式提升代码的灵活性、复用性和可维护性。

学不可以已,活到老,学到老。 957
上一篇: spring aop学习9:Aop的链式调用(责任链模式)
下一篇: 策略模式的结构
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值