三分钟掌握“职责链模式”——轻松搞定设计模式

职责链模式的官方定义:

职责链模式使得多个对象都有机会处理请求,从而降低了请求的发送者和接受者之间的耦合关系。这些对象被连成一条链,并沿着这条链传递发送者的请求,直到有一个对象能处理它为止。

职责链模式的类图:

1.职责链由若干个处理类拼接而成。每个处理类都有两个函数,setNext(Handler)用于设置当前处理类的下一跳地址,handle(request)用于处理请求。

若当前处理类的handle函数无法处理该请求,就将请求传给下一个处理类的handle函数处理。

2.这些处理类写完后交付给客户端。客户端需要创建所有处理类的对象,然后通过每个对象的setNext(Handler)函数设置每个对象的下一跳地址。然后执行某一个处理类对象的handler(request)函数,那么整条链就开始工作了;request会以此传递下去,直到某一个处理类能处理该请求为止。

职责链的好处:

(请求的处理类称为请求的接收者)

请求的发送者和接收者都不知道对方是谁,也就是接收者不知道发送者是谁,发送者不知道接收者是谁;而且链中的所有处理类都不知道链的结构。

职责链简化了对象的相互连接,每个对象仅仅需要维护一个下一跳地址,而不需要保存所有候选接收者的引用,这就大大降低了藕合度。

而且链的结构是由客户端定义的,客户端拿到的一个个处理类就像是一个个元器件,需要我们自己组装,因此这种方式很灵活,但也要避免一条请求走到链的末尾还是没有被处理的情况。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏salesforce零基础学习

salesforce 零基础开发入门学习(八)数据分页简单制作

本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能。 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的...

2188
来自专栏欧阳大哥的轮子

从Xcode10不再支持libstdc++说起

众所周知从Xcode10起,苹果摒弃了对libstdc++库的支持转而支持libc++库了。这两个库在Xcode9甚至更早的版本就已经同时存在于系统中并且可供开...

2483
来自专栏JackieZheng

RabbitMQ入门-从HelloWorld开始

从读者的反馈谈RabbitMQ 昨天发完《RabbitMQ入门-初识RabbitMQ》,我陆陆续续收到一些反馈。鉴于部分读者希望结合实例来讲 期待下篇详细,最好...

2115
来自专栏Spark学习技巧

Kafka源码系列之topic创建分区分配及leader选举

一,基本介绍 本文讲解依然是基于kafka源码0.8.2.2。假如阅读过前面的文章应该知道,用户的admin指令都是通过Zookeeper发布给kafka的Co...

8016
来自专栏mySoul

mongodb

NoSQL不使用SQL作为查询语言。其数据的储存可以不需要固定的表格形式。也会经常的被使用sql的join

1500
来自专栏技术小讲堂

WCF中操作的分界于调用顺序和会话的释放操作分界实例停止

操作分界 在WCF操作契约的设计中,有时会有一些调用顺序的业务,有的操作不能最先调用,有的操作必须最后调用,比如在从一个箱子里拿出一件东西的时候,必须先要执行打...

3306
来自专栏玄魂工作室

看代码学PHP渗透(3) - 实例化任意对象漏洞

大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫 PHP-Audit-Labs 。...

5341
来自专栏小樱的经验随笔

小白必须懂的MongoDB的十大总结

本文首发于imooc:https://www.imooc.com/article/75436

2.6K3
来自专栏吴伟祥

远程方法调用(RMI)原理与示例 转

  远程方法调用(RMI)顾名思义是一台机器上的程序调用另一台机器上的方法。这样可以大致知道RMI是用来干什么的,但是这种理解还不太确切。RMI是Java支撑分...

952
来自专栏蓝天

redis的一些简介

Redis是Remote Dictionary Server的缩写,他本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库。

991

扫码关注云+社区