责任链模式的应用场景
通俗易懂设计模式解析——责任链模式

通俗易懂设计模式解析——责任链模式前言今天我们介绍的是责任链模式【Chain of Responsibility Pattern】。
对于责任链模式理解起来还是比较容易的。
例如在公司请假、三天以内部门经理批准即可,但是三到七天可能就需要总监批准了、七天以上需要副总裁批准。
对于这么一个需求最初的解决方案就是if-else语句判断。
但是一旦请假的模式增加一种则需要对多重if-else进行修改,这就违背了开闭原则。
这个时候就可以采用责任链模式来解决其问题。
责任链模式为请求创建一个接收者对象的链。
这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
责任链模式介绍一、来由在软件系统中,经常会有一个请求可能会被多个对象处理。
但是每一次都是被一个对象处理。
又不能确定是哪一个对象。
如果显示指定每一个对象。
会对请求发送者和接收者造成紧耦合。
那么如何做到对请求的发送者和接收者进行解耦。
并且在运行时自行决定处理请求的对象呢?二、意图避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
三、案例四、责任链模式代码示例看上述案例图,主要涉及到两个部分:抽象处理者:定义一个处理请求的接口具体处理者:实现处理请求的接口、可以选择是自己处理或者传递给下一个接收者。
包含对下一个接收处理者的引用。
责任链模式的组成部分还是比较简单的。
我们看这么一个案例,还是用户结算时金额计算的案例。
根据用户的会员等级进行对应的折扣结算。
普通用户全额计算、普通会员95折计算、黄金会员9折计算、钻石会员7折计算:我们首先看看不使用责任链模式如何处理:namespace ChainofResponsibility_Pattern{class Program{ static void Main(string[] args){decimal Money =200M;var memberType = MemberType.GoldMember;//普通会员,95折计算if (memberType == MemberType.Member){Console.WriteLine($"普通会员,95折计算,最后金额为{Money * 0.95M}");}//黄金会员,9折计算else if(memberType == MemberType.GoldMember){Console.WriteLine($"黄金会员,9折计算,最后金额为{Money * 0.9M}");}//钻石会员,7折计算else if(memberType == MemberType.DiamondsMember){Console.WriteLine($"钻石会员,7折计算,最后金额为{Money * 0.7M}");}//无会员,全额计算else{Console.WriteLine($"无会员,全额计算,最后金额为{Money}");}}public enum MemberType{[Description("无会员")]NoMember = 1,[Description("普通会员")]Member = 2,[Description("黄金会员")]GoldMember = 3,[Description("钻石会员")]DiamondsMember = 4}}}这里我们可以看到我们使用了多个if条件判断完成的此需求(或者switch语句)。
c语言责任链模式 -回复

c语言责任链模式-回复责任链模式是一种行为设计模式,用于将请求从一个对象传递到另一个对象,直到请求被处理或达到处理器链的末尾。
在这个模式中,请求沿着一系列互相关联的处理器对象链传递,每个处理器对象都有机会处理请求或将其传递给下一个处理器对象。
在实际应用中,责任链模式可以用于许多场景,例如日志记录、权限验证、异常处理等。
在本文中,我们将以权限验证为例,一步一步地介绍责任链模式的原理、结构和实现方法。
1. 原理:责任链模式由一系列的处理器对象组成,每个处理器对象都有自己的职责和处理逻辑。
当一个请求到达时,责任链的头部处理器开始处理请求,如果可以处理该请求,则处理请求并结束。
如果无法处理该请求,则将其传递给责任链中的下一个处理器对象,直到请求被处理或者到达责任链的末尾。
2. 结构:责任链模式包含以下几个角色:- Handler(处理器):定义处理请求的接口,并保持对下一个处理器的引用。
- ConcreteHandler(具体处理器):实现处理请求的逻辑,并根据需要决定是否将请求传递给下一个处理器。
- Client(客户端):创建处理器链,将请求传递给链的头部处理器开始处理。
3. 实现:我们以权限验证为例,来演示如何使用责任链模式。
首先,我们定义一个处理器接口Handler,它包含处理请求的方法handleRequest()和设置下一个处理器的方法setNextHandler()。
然后,我们创建两个具体处理器AdminHandler和UserHandler,它们分别实现了Handler接口。
AdminHandler负责验证管理员权限,如果请求是管理员权限,就处理请求,否则将其传递给下一个处理器。
UserHandler 处理普通用户的请求。
接下来,我们在Client中创建处理器链,并将请求传递给链的头部处理器。
每个处理器在处理请求时,都可以决定是否将请求传递给下一个处理器。
以下是代码示例:定义处理器接口interface Handler {void handleRequest(Request request);void setNextHandler(Handler nextHandler);}具体处理器实现class AdminHandler implements Handler {private Handler nextHandler;public void handleRequest(Request request) {if (request.getPermission().equals("admin")) {处理请求System.out.println("Admin handled the request.");} else {传递给下一个处理器nextHandler.handleRequest(request);}}public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler;}}class UserHandler implements Handler {private Handler nextHandler;public void handleRequest(Request request) {if (request.getPermission().equals("user")) {处理请求System.out.println("User handled the request.");} else {传递给下一个处理器nextHandler.handleRequest(request);}}public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler;}}定义请求类class Request {private String permission;public Request(String permission) {this.permission = permission;}public String getPermission() {return permission;}}客户端代码public class Client {public static void main(String[] args) {创建处理器对象Handler adminHandler = new AdminHandler();Handler userHandler = new UserHandler();设置处理器链adminHandler.setNextHandler(userHandler);创建请求Request request1 = new Request("admin");Request request2 = new Request("user");发起请求adminHandler.handleRequest(request1); Output: Admin handled the request.adminHandler.handleRequest(request2); Output: User handled the request.}}通过运行上述代码,我们可以看到,当请求的权限是"admin"时,会由AdminHandler处理;当请求的权限是"user"时,会由UserHandler处理。
php设计模式之责任链模式

php设计模式之责任链模式php设计模式之责任链模式实际问题你的论坛有举报功能,版主能解决粗⼝⽅⾯的举报,警察能解决严重⼀点的黄赌毒⽅⾯的举报,更严重的反政府的举报就需要由国安局来完成。
职场中每个⼈都有直属的上级,如果到达⾃⼰的问题⾃⼰能够处理,就⾃⼰处理,否则交给上级。
这⾥相当于警察是版主的上级,国安是警察的上级。
简介职责链模式(⼜叫责任链模式)包含了⼀些命令对象和⼀些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把⾃⼰不能处理的命令对象交下⼀个处理对象,该模式还描述了往该链添加新的处理对象的⽅法。
职场中每个⼈都有直属的上级,如果到达⾃⼰的问题⾃⼰能够处理,就⾃⼰处理,否则交给上级。
当⼀个问题来到的时候,将这个问题交给最低级的处理者,能处理就处理,不能处理就往上⾯传。
每个管理者都有指向上级的⼀个指针。
类图⾓⾊:抽象处理者(Manager):定义出⼀个处理请求的接⼝。
如果需要,接⼝可以定义出⼀个⽅法,以设定和返回对下家的引⽤。
这个⾓⾊通常由⼀个抽象类或接⼝实现。
具体处理者(CommonManager):具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
由于具体处理者持有对下家的引⽤,因此,如果需要,具体处理者可以访问下家。
代码1 <?php2/**3 * Created by PhpStorm.4 * User: Jang5 * Date: 2015/6/116 * Time: 10:167*/89//申请Model10class Request11 {12//数量13public$num;14//申请类型15public$requestType;16//申请内容17public$requestContent;18 }1920//抽象管理者21abstract class Manager22 {23protected$name;24//管理者上级25protected$manager;26public function __construct($_name)27 {28$this->name = $_name;29 }3031//设置管理者上级32public function SetHeader(Manager $_mana)33 {34$this->manager = $_mana;35 }3637//申请请求38abstract public function Apply(Request $_req);3940 }4142//经理43class CommonManager extends Manager44 {45public function __construct($_name)46 {47 parent::__construct($_name);48 }49public function Apply(Request $_req)50 {51if($_req->requestType=="请假" && $_req->num<=2)52 {53echo "{$this->name}:{$_req->requestContent} 数量{$_req->num}被批准。
责任链模式和观察者模式

责任链模式和观察者模式责任链模式顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了⼀个接收者对象的链。
这种模式给予请求的类型,对请求的发送者和接收者进⾏解耦。
这种类型的设计模式属于⾏为型模式。
这种模式中,通常每个接收者都包含对另⼀个接收者的调⽤。
如果⼀个对象不能处理请求,那么它会把相同的请求传给下⼀个接收者,以此类推。
介绍意图:避免请求发送者和接收者耦合在⼀起,让多个对象都有可能接收请求,将这些对象连接成⼀条链,并且沿着这条链传递请求,直到有对象处理他为⽌。
主要解决:职责链上处理者负责处理请求,客户只需要将请求发送到职责链上即可,⽆须关⼼请求的处理细节和请求的传递,所以职责链中请求的发送者和处理者解耦了。
何时使⽤:在处理消息的时候以过滤很多道。
如何解决:拦截的类都实现统⼀接⼝。
应⽤实例: 1、红楼梦中的"击⿎传花"。
2、JS 中的事件冒泡。
3、JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。
优点: 1、降低耦合度。
它将请求的发送者和接收者解耦。
2、简化了对象。
使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。
通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很⽅便。
缺点: 1、不能保证请求⼀定被接收。
2、系统性能将受到⼀定影响,⽽且在进⾏代码调试时不太⽅便,可能会造成循环调⽤。
3、可能不容易观察运⾏时的特征,有碍于除错。
使⽤场景: 1、有多个对象可以处理同⼀个请求,具体哪个对象处理该请求由运⾏时刻⾃动确定。
2、在不明确指定接收者的情况下,向多个对象中的⼀个提交⼀个请求。
3、可动态指定⼀组对象处理请求。
注意事项:在 JAVA WEB 中遇到很多应⽤。
观察者模式当对象间存在⼀对多关系时,则使⽤观察者模式(Observer Pattern)。
责任链模式的具体应用

责任链模式的具体应⽤1.业务场景⽣产车间中使⽤的条码扫描,往往⼀把扫描枪需要扫描不同的条码来处理不同的业务逻辑,⽐如,扫描投⼊料⼯位条码、扫描投⼊料条码、扫描产出⼯装条码等,每种类型的条码位数是不⼀样,因此通过条码长度来进⾏业务区分。
2.初步设计⾯对此场景,能够想到的最简单的设计就是使⽤if...else if...或者swith进⾏判断,因此,我们编写的代码如下1switch(barCode.length)2 {3case3:4 DoSomething1();5break;6case4:7 DoSomething2();8break;9case5:10 DoSomething3();11break;12default:13 DoSomething4();14break;15 }使⽤是if...else if...或者switch已经基本上满⾜了需求,以后需要添加扫描场景,只需要增加判断,完成对应的⽅法即可。
作为⼀个程序员,仅仅满⾜需求的话,往往降低了对⾃⼰的要求,同时,随着扫描业务的增加,switch中的代码逐渐增加,多到我们⾃⼰都觉得这段代码读起来就像是吃着前天剩下的硬馒头⼀样,难以下咽。
3.设计提升上述场景完全可以使⽤设计模式中的责任链模式来进⾏优化,实施步骤如下:3.1 定义处理结果⼀个处理在责任链上流动时,有两种结果,⼀是不能处理,转给其后继者,⼆是可以处理,同时⼜引出两种结果,处理成功和处理失败。
因此,对处理结果统⼀定义为枚举类型1public enum HandleResult2 {3 ///<summary>4///成功5///</summary>6 Success=0,7///<summary>8///失败9///</summary>10 Failed = 1,11///<summary>12///未处理13///</summary>14 Unhandle = 215 }3.2定义业务抽象类AbstractBarCodeHandler定义业务抽象类,包含⼀个属性“Successor”,⽤于标记其后继者,⼀个公共⽅法“HandleRequest”,当调⽤真正的业务处理⽅法时返回未处理,则调⽤其后继者进⾏处理,⼀个抽象⽅法“HandleRequestCore”,每个扫描业务具体类,需要实现此⽅法,并对条码进⾏处理。
设计模式之责任链模式

设计模式之责任链模式责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它将请求的发送者和接受者解耦,并且允许多个对象都有机会处理这个请求。
责任链模式通常被用于处理对象间的请求传递,使得每个对象都有机会处理请求,同时避免请求的发送者和接受者之间的耦合关系。
责任链模式由一系列的处理对象组成,每个处理对象都负责处理特定的请求,并且对下一个处理对象的引用。
当一个请求被发送时,责任链上的每个处理对象依次判断是否能处理该请求,如果能则立即处理,如果不能则传递给下一个处理对象。
这样,请求发送者并不需要知道请求最终会被哪个对象处理。
责任链模式的结构包括以下几个角色:1. 抽象处理者(Handler):定义处理请求的接口,通常包含一个指向下一个处理者的引用。
2. 具体处理者(ConcreteHandler):实现抽象处理者的接口,具体处理请求的逻辑,并且可根据需要传递请求给下一个处理者。
下面通过一个实际的例子来说明责任链模式的应用。
假如在一个电商系统中,有三个订单处理的环节:商品审核、支付检查和库存验证。
货物在途过程中,可能会出现商品信息不完整、支付异常或库存不足的情况。
我们可以使用责任链模式来设计这样一个订单处理系统。
首先,定义一个抽象处理者(Handler)接口,包含一个处理请求的方法,并且可以设置下一个处理者的引用。
```javapublic interface Handler {void setNextHandler(Handler handler);void handleRequest(Order order);}```然后,实现具体的处理者(ConcreteHandler)类,包括商品审核处理者、支付检查处理者和库存验证处理者。
每个具体处理者都实现了处理请求的方法,并且根据需要判断是否需要传递请求给下一个处理者。
```javapublic class ProductCheckHandler implements Handler {private Handler nextHandler;@Overridepublic void setNextHandler(Handler handler) {this.nextHandler = handler;}@Overridepublic void handleRequest(Order order) {// 商品审核逻辑// ...// 如果有下一个处理者,则传递请求if (nextHandler != null) {nextHandler.handleRequest(order);}}}public class PaymentCheckHandler implements Handler { private Handler nextHandler;@Overridepublic void setNextHandler(Handler handler) {this.nextHandler = handler;}@Overridepublic void handleRequest(Order order) {// 支付检查逻辑// ...// 如果有下一个处理者,则传递请求if (nextHandler != null) {nextHandler.handleRequest(order);}}}public class StockCheckHandler implements Handler { private Handler nextHandler;@Overridepublic void setNextHandler(Handler handler) {this.nextHandler = handler;}@Overridepublic void handleRequest(Order order) {// 库存验证逻辑// ...// 如果有下一个处理者,则传递请求if (nextHandler != null) {nextHandler.handleRequest(order);}}}```最后,在客户端代码中组装责任链,并将请求发送给第一个处理者。
责任链模式 选择题

责任链模式选择题
1. 什么是责任链模式?
A. 是一种设计模式,用于处理请求链中的多个处理程序
B. 是一种编程语言,用于编写可重用的软件组件
C. 是一种网络协议,用于实现互联网连接
2. 责任链模式的主要优点是什么?
A. 提高代码的可读性和可维护性
B. 减少代码量并简化编程过程
C. 提高系统的可扩展性和灵活性
3. 在责任链模式中,通常会有一个处理程序链,以下哪个描述是正确的?
A. 处理程序链中的每个处理程序都独立处理请求
B. 处理程序链中的每个处理程序都只能处理特定类型的请求
C. 处理程序链中的每个处理程序都按照顺序处理请求,并将结果传递给下一个处理程序
4. 在责任链模式中,如何处理无法处理的请求?
A. 直接忽略无法处理的请求
B. 将无法处理的请求传递给链中的下一个处理程序
C. 将无法处理的请求传递给调用者,由调用者决定如何处理
5. 以下哪个不是责任链模式的应用场景?
A. Web开发中的请求处理
B. 数据库查询优化
C. 分布式系统中的服务调用
6. 在责任链模式中,通常哪个类会处理请求?
A. 链中的第一个节点
B. 链中的最后一个节点
C. 链中的任意一个节点
D. 链中的指定节点
7. 责任链模式主要应用于哪些场景?
A. 单个请求需要被多个处理者处理的情况
B. 多个请求需要被单个处理者处理的情况
C. 需要对请求进行过滤或转换的情况
D. 需要对请求进行路由或分发的情况
8. 在责任链模式中,通常使用什么方法来传递请求?
A. 直接调用
B. 事件驱动
C. 回调函数
D. 信号量。
C#设计模式(21)——责任链模式

C#设计模式(21)——责任链模式⼀、引⾔ 在现实⽣活中,有很多请求并不是⼀个⼈说了就算的,例如⾯试时的⼯资,低于1万的薪⽔可能技术经理就可以决定了,但是1万~1万5的薪⽔可能技术经理就没这个权利批准,可能就需要请求技术总监的批准,所以在⾯试的完后,经常会有⾯试官说,你这个薪⽔我这边觉得你这技术可以拿这个薪⽔的,但是还需要技术总监的批准等的话。
这个例⼦也就诠释了本⽂要介绍的内容。
⽣活中的这个例⼦真是应⽤了责任链模式。
2.1 责任链模式的定义 从⽣活中的例⼦可以发现,某个请求可能需要⼏个⼈的审批,即使技术经理审批完了,还需要上⼀级的审批。
这样的例⼦,还有公司中的请假,少于3天的,直属Leader就可以批准,3天到7天之内就需要项⽬经理批准,多余7天的就需要技术总监的批准了。
介绍了这么多⽣活中责任链模式的例⼦的,下⾯具体给出⾯向对象中责任链模式的定义。
责任链模式指的是——某个请求需要多个对象进⾏处理,从⽽避免请求的发送者和接收之间的耦合关系。
将这些对象连成⼀条链⼦,并沿着这条链⼦传递该请求,直到有对象处理它为⽌。
2.2 从责任链模式的定义可以发现,责任链模式涉及的对象只有处理者⾓⾊,但由于有多个处理者,它们具有共同的处理请求的⽅法,所以这⾥抽象出⼀个抽象处理者⾓⾊进⾏代码复⽤。
这样分析下来,责任链模式的结构图也就不⾔⽽喻了,具体结构图如下所⽰。
主要涉及两个⾓⾊:抽象处理者⾓⾊(Handler):定义出⼀个处理请求的接⼝。
这个接⼝通常由接⼝或抽象类来实现。
具体处理者⾓⾊(ConcreteHandler):具体处理者接受到请求后,可以选择将该请求处理掉,或者将请求传给下⼀个处理者。
因此,每个具体处理者需要保存下⼀个处理者的引⽤,以便把请求传递下去。
2.3 责任链模式的实现 有了上⾯的介绍,下⾯以公司采购东西为例⼦来实现责任链模式。
公司规定,采购架构总价在1万之内,经理级别的⼈批准即可,总价⼤于1万⼩于2万5的则还需要副总进⾏批准,总价⼤于2万5⼩于10万的需要还需要总经理批准,⽽⼤于总价⼤于10万的则需要组织⼀个会议进⾏讨论。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
责任链模式的应用场景
责任链模式是一种行为设计模式,它通过一系列的处理器对象形成一个链,每个处理器都有机会处理请求,直到请求被处理或者到达链的末端。
该模式常用于解耦发送者和接收者,将请求沿着链传递,并动态地决定由哪个处理器来处理请求。
责任链模式的应用场景非常广泛,下面将介绍几个典型的应用场景:
1. 请求处理链:在一个系统中,可能存在多个处理器,每个处理器负责不同的处理逻辑。
通过使用责任链模式,可以将这些处理器连接成一个处理链,每个请求按照处理链的顺序依次经过处理器进行处理,直到找到合适的处理器处理请求或者请求被拒绝。
这种模式可以实现请求的动态处理和灵活的扩展,提高系统的可维护性和可扩展性。
2. 日志记录:在日志记录的场景中,可以使用责任链模式来实现不同级别的日志记录。
例如,系统中分为普通日志、警告日志和错误日志三个级别,每个级别对应一个处理器,处理器根据日志级别来决定是否处理该日志,以及如何处理。
这样,请求日志的对象只需要将日志传递给处理链的第一个处理器,而无需关心具体的处理过程,大大简化了代码的编写和维护。
3. 身份认证:在网络应用中,身份认证是一个重要的功能。
责任链模式可以用于实现不同方式的身份认证,例如用户名密码认证、邮
箱验证码认证、短信验证码认证等。
每个认证方式都可以由一个处理器来处理,根据请求的方式和内容来判断是否通过认证。
如果一个处理器无法认证通过,则将请求传递给下一个处理器进行处理,直到找到合适的处理器或者认证失败。
4. 资源分配:在资源分配的场景中,可以使用责任链模式来实现资源的动态分配和优化。
例如,一个服务器集群中存在多台服务器,每台服务器负责处理不同类型的请求。
通过使用责任链模式,可以将请求按照类型分发给不同的服务器进行处理,实现负载均衡和资源优化。
5. 异常处理:在系统开发中,异常处理是一个重要的环节。
责任链模式可以用于实现异常的捕获和处理。
可以将异常捕获的逻辑封装在处理器中,当一个异常被抛出时,责任链上的处理器会依次尝试处理该异常,直到找到合适的处理器或者异常无法处理。
总的来说,责任链模式适用于需要将请求和处理解耦的场景,同时又需要动态地组织处理逻辑的场景。
通过使用责任链模式,可以实现请求的动态处理、灵活的扩展和简化的代码编写,提高系统的可维护性和可扩展性。
同时,该模式还可以用于日志记录、身份认证、资源分配和异常处理等多个领域。