责任链模式

合集下载

责任链策略+策略模式组合

责任链策略+策略模式组合

责任链策略+策略模式组合责任链模式(Chain of Responsibility Pattern)和策略模式(Strategy Pattern)都是设计模式中的重要组成部分,可以有效地解决一些特定的问题。

将两者组合使用,可以在责任链的每个节点上应用不同的策略,从而实现策略的动态切换和组合。

在责任链模式中,多个对象可以处理请求,但只有一个对象能够处理请求并返回结果。

其他对象则将请求传递给下一个对象,直到某个对象处理了请求。

这种模式可以用于解耦对象之间的依赖关系,使得请求的传递和处理更加灵活。

策略模式则允许将算法独立于使用它的客户端而变化。

它定义了一系列算法,并将每个算法封装起来,使得它们可以互相替换。

策略模式使得算法可以独立于使用它的客户端而变化,从而提高了系统的灵活性和可扩展性。

将责任链模式和策略模式组合使用,可以在责任链的每个节点上应用不同的策略。

这样,客户端只需要与链中的一个节点进行交互,就可以使用不同的策略。

客户端只需要知道特定节点的接口,而不必关心其他节点的具体实现。

这样可以使系统的实现更加灵活,也方便了系统的扩展和维护。

具体实现时,可以按照以下步骤进行:1. 定义抽象策略:创建一个接口,定义一些方法来处理不同的任务或操作。

2. 定义多个策略类:实现抽象策略接口,并实现各自的方法。

这些策略类将根据不同的需求实现不同的算法或行为。

3. 创建责任链:定义一个责任链接口和实现类,责任链接口包含一些方法用于处理请求,这些方法会将请求传递给链中的下一个对象。

4. 在客户端中使用责任链:客户端只需要与链中的一个节点进行交互,就可以使用不同的策略。

通过这种方式,客户端可以根据需要选择不同的策略,而无需修改客户端代码。

同时,这种组合使用也使得系统的实现更加灵活和可扩展。

职责链设计模式

职责链设计模式

职责链设计模式一、什么是职责链设计模式职责链设计模式(Chain of Responsibility)是一种行为设计模式,它允许多个对象按照其顺序依次处理请求,直到请求被处理或者到达链的末尾。

每个对象在收到请求后,可以选择将其处理,然后传递给下一个对象,也可以选择不处理,从而将请求传递给下一个对象。

这种模式将请求发送者和接收者解耦,使得多个对象都有可能处理请求,提高了代码的灵活性。

二、应用场景职责链设计模式通常应用于以下场景:1.处理请求的对象不确定,并且可以在运行时动态添加或删除对象。

2.需要按照特定顺序对请求进行处理。

3.请求的发送者和接收者需要解耦,避免耦合度过高。

4.想要在不明确指定接收者的情况下,动态地指定处理该请求的对象。

三、实现方式职责链设计模式的核心思想是将请求通过一个对象链传递,并让不同的对象依次处理请求。

下面是实现该模式的一般步骤:1.定义一个抽象处理器(Handler)类,其中包含一个指向下一个处理器的引用。

2.派生具体处理器(ConcreteHandler)类,实现请求处理的具体逻辑,并在需要时将请求传递给下一个处理器。

3.在客户端代码中创建处理器链的实例,并将请求发送到链的起始位置。

四、实例演示以一个账单审批系统为例,系统中有三个级别的审批者:经理、副总经理和总经理。

账单金额小于1000元的由经理审批,小于5000元的由副总经理审批,其余由总经理审批。

1. 定义抽象处理器类public abstract class Approver {protected Approver nextApprover;public void setNextApprover(Approver nextApprover) {this.nextApprover = nextApprover;}public abstract void approve(Bill bill);}2. 派生具体处理器类public class Manager extends Approver {@Overridepublic void approve(Bill bill) {if (bill.getAmount() < 1000) {System.out.println("Manager approved the bill with amount: " + bil l.getAmount());} else if (nextApprover != null) {nextApprover.approve(bill);}}}public class VicePresident extends Approver {@Overridepublic void approve(Bill bill) {if (bill.getAmount() < 5000) {System.out.println("Vice President approved the bill with amount: " + bill.getAmount());} else if (nextApprover != null) {nextApprover.approve(bill);}}}public class President extends Approver {@Overridepublic void approve(Bill bill) {System.out.println("President approved the bill with amount: " + bill. getAmount());}}3. 创建处理器链的实例并发送请求public class Main {public static void main(String[] args) {Approver manager = new Manager();Approver vicePresident = new VicePresident();Approver president = new President();manager.setNextApprover(vicePresident);vicePresident.setNextApprover(president);Bill bill1 = new Bill(800);manager.approve(bill1);Bill bill2 = new Bill(3000);manager.approve(bill2);Bill bill3 = new Bill(10000);manager.approve(bill3);}}4. 运行结果Manager approved the bill with amount: 800Vice President approved the bill with amount: 3000President approved the bill with amount: 10000五、优缺点优点:1.降低了请求发送者和接收者之间的耦合度,使得处理请求的对象可以独立变化。

责任链模式的应用场景

责任链模式的应用场景

责任链模式的应用场景责任链模式是一种行为设计模式,它通过一系列的处理器对象形成一个链,每个处理器都有机会处理请求,直到请求被处理或者到达链的末端。

该模式常用于解耦发送者和接收者,将请求沿着链传递,并动态地决定由哪个处理器来处理请求。

责任链模式的应用场景非常广泛,下面将介绍几个典型的应用场景:1. 请求处理链:在一个系统中,可能存在多个处理器,每个处理器负责不同的处理逻辑。

通过使用责任链模式,可以将这些处理器连接成一个处理链,每个请求按照处理链的顺序依次经过处理器进行处理,直到找到合适的处理器处理请求或者请求被拒绝。

这种模式可以实现请求的动态处理和灵活的扩展,提高系统的可维护性和可扩展性。

2. 日志记录:在日志记录的场景中,可以使用责任链模式来实现不同级别的日志记录。

例如,系统中分为普通日志、警告日志和错误日志三个级别,每个级别对应一个处理器,处理器根据日志级别来决定是否处理该日志,以及如何处理。

这样,请求日志的对象只需要将日志传递给处理链的第一个处理器,而无需关心具体的处理过程,大大简化了代码的编写和维护。

3. 身份认证:在网络应用中,身份认证是一个重要的功能。

责任链模式可以用于实现不同方式的身份认证,例如用户名密码认证、邮箱验证码认证、短信验证码认证等。

每个认证方式都可以由一个处理器来处理,根据请求的方式和内容来判断是否通过认证。

如果一个处理器无法认证通过,则将请求传递给下一个处理器进行处理,直到找到合适的处理器或者认证失败。

4. 资源分配:在资源分配的场景中,可以使用责任链模式来实现资源的动态分配和优化。

例如,一个服务器集群中存在多台服务器,每台服务器负责处理不同类型的请求。

通过使用责任链模式,可以将请求按照类型分发给不同的服务器进行处理,实现负载均衡和资源优化。

5. 异常处理:在系统开发中,异常处理是一个重要的环节。

责任链模式可以用于实现异常的捕获和处理。

可以将异常捕获的逻辑封装在处理器中,当一个异常被抛出时,责任链上的处理器会依次尝试处理该异常,直到找到合适的处理器或者异常无法处理。

行为型设计模式介绍

行为型设计模式介绍

行为型设计模式介绍行为型设计模式是指用于解决对象之间交互及职责分配的设计模式,它们主要描述了不同对象之间的通信方式,以及如何控制对象之间的交互流程。

这些模式通过将行为分离到不同的对象中,来实现更好的封装性和可复用性。

在本篇论文中,我们将对行为型设计模式做一个简要的介绍,包括模式的定义、分类以及如何在实际开发中应用它们。

一、定义行为型设计模式是指一系列用于对象之间交互和职责分配的设计模式。

这些模式主要解决对象间的通信方式以及如何控制对象之间的交互流程。

与创建型设计模式和结构型设计模式不同,行为型设计模式更关注对象之间的功能分配,而不是组成对象的方式。

行为型设计模式主要包括以下几种:1、责任链模式:将请求的发送者和接收者解耦,构造成一条链,依次发送请求,直到有一个接收者处理为止。

2、命令模式:将请求封装成对象,使得请求的发送者与请求的接收者之间解耦,并且可以动态地添加或删除请求。

3、迭代器模式:提供一种方法来顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

4、中介者模式:定义一个中介对象来封装一系列对象之间的交互,使得各对象之间不需要直接相互作用,从而降低耦合度。

5、备忘录模式:提供一种方式来捕获对象的内部状态,并可以在需要的时候恢复对象到之前的状态。

6、观察者模式:对象之间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并且自动更新。

7、状态模式:允许一个对象在其内部状态改变时改变其行为,从而使对象看起来似乎修改了其所属的类。

8、策略模式:定义了一系列算法,并将每个算法都封装起来,使得它们可以互相替换。

9、模板方法模式:定义了一个算法框架,由具体子类实现其中的某些步骤,可以提供一个保护性的具体方法,以约束它的子类必须遵循的规则。

10、访问者模式:在不改变对象的前提下,定义作用于对象某些元素的新操作。

二、分类行为型设计模式可以分为两类:类行为型模式和对象行为型模式。

责任链模式的应用场景

责任链模式的应用场景

责任链模式的应用场景责任链模式是一种行为设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

在责任链模式中,请求沿着一个链传递,直到有一个对象能够处理它为止。

责任链模式的应用场景很广泛,下面将介绍一些常见的应用场景。

1. 用户认证和授权在一个系统中,用户的请求可能需要经过多个环节的认证和授权才能被处理。

使用责任链模式,可以将这些环节抽象成一个个的处理器,并按照认证和授权的顺序组成一个责任链。

当用户发送请求时,责任链中的处理器依次进行认证和授权操作,直到有一个处理器能够处理该请求或者整个责任链结束。

2. 日志记录在一个系统中,需要对某些操作进行日志记录,以便后续的审计和问题排查。

使用责任链模式,可以将日志记录的逻辑封装到多个处理器中,并按照一定的顺序组成一个责任链。

当需要记录日志时,请求会沿着责任链传递,每个处理器都可以选择是否记录日志,以及记录日志的方式和内容。

3. 异常处理在一个系统中,可能会出现各种各样的异常情况,需要对这些异常进行处理。

使用责任链模式,可以将不同类型的异常处理逻辑分别封装到不同的处理器中,并按照一定的顺序组成一个责任链。

当系统出现异常时,请求会沿着责任链传递,每个处理器都可以选择是否处理该异常,以及如何处理。

4. 数据校验在一个系统中,用户输入的数据需要进行校验,以确保数据的有效性和合法性。

使用责任链模式,可以将不同类型的校验逻辑封装到不同的处理器中,并按照一定的顺序组成一个责任链。

当用户输入数据时,请求会沿着责任链传递,每个处理器都可以选择是否校验该数据,以及如何校验。

5. 请求过滤在一个系统中,可能需要对请求进行过滤,以确保请求的合法性和安全性。

使用责任链模式,可以将不同类型的过滤逻辑封装到不同的处理器中,并按照一定的顺序组成一个责任链。

当请求到达时,请求会沿着责任链传递,每个处理器都可以选择是否过滤该请求,以及如何过滤。

以上是责任链模式的一些常见应用场景,通过使用责任链模式,可以将复杂的处理逻辑分解成多个简单的处理器,使系统更加灵活和可扩展。

风控规则责任链模式-概述说明以及解释

风控规则责任链模式-概述说明以及解释

风控规则责任链模式-概述说明以及解释1.引言1.1 概述在金融、互联网等行业中,风控规则是保障业务安全和风险控制的关键环节。

风控规则用于检测、判断和控制不符合规定的行为和交易,以保护公司和用户的利益。

然而,随着业务的不断扩展和复杂化,单一的风控规则已经无法满足多样化的业务需求。

责任链模式是一种能够解决复杂业务需求的设计模式。

它通过将请求与处理逻辑解耦,形成一个责任链条,每个处理节点都可以根据需求进行处理或者转发请求,从而满足不同的业务规则。

责任链模式可以提高系统的灵活性和可扩展性,使得处理逻辑更加清晰和易于维护。

风控规则责任链模式将风控规则与责任链模式相结合,以应对复杂多变的业务风险和需求。

通过将不同的风控规则按照一定的顺序组织成责任链条,可以逐个处理和判断不符合规定的行为和交易。

当一个规则节点无法处理时,将请求转发给责任链上的下一个节点,直到找到能够处理该请求的节点为止。

这种方式可以使得系统更加灵活和高效,能够快速响应不同的业务需求和风险情况。

本文将深入探讨风控规则责任链模式的定义、原理、实现方式,以及其在实际应用中的优点和应用案例。

通过对该模式的研究,我们可以更好地理解和应用风控规则责任链模式,提升系统的风险控制能力,保护业务的安全和稳定。

文章结构部分的内容可以写成以下形式:1.2 文章结构本文主要包括以下几个部分:2. 正文部分:介绍风控规则责任链模式的相关概念、定义、作用以及实际应用。

2.1 风控规则:首先,会对风控规则进行详细的定义,并探讨其在金融、互联网等领域中的作用。

此外,还会探讨不同场景下的风控规则应用。

2.2 责任链模式:接着,我们将介绍责任链模式的定义以及其在软件设计中的原理。

同时,还会对责任链模式的常见实现方式进行讨论。

2.3 风控规则责任链模式:最后,我们将深入研究风控规则责任链模式的概述,包括其优点和应用案例。

我们将探讨该模式在风控规则中的具体应用,并详细讲解其在实际项目中的实施方式。

责任链模式和状态模式对比(转)

责任链模式和状态模式对比(转)

责任链模式和状态模式对⽐(转)概述 常⽤23中设计模式中,有三种模式容易混淆,这三种模式即责任链模式、状态模式以及策略模式。

现在想深⼊了解下这3种设计模式的区别,在⽹上找找之后,发现有⼀篇博客写的相对清晰。

先将内容整理转载如下,也算是对知识的记载和传承;状态模式与策略模式⽐较1、定义: 状态模式:通过改变对象的内部状态⽽改变对象⾃⾝的⾏为,这个对象表现得就好像修改了它的类⼀样。

策略模式:定义⼀组算法,并将每⼀个算法封装起来,使得它们可以互换。

算法的替换不影响调⽤算法的客户端;2、异同: 态模式关键是各个状态⼦类必须知道下⼀个状态是啥,且要把逻辑判断转移到各个状态⼦类中,客户端不需要了解状态迁移的顺序,且状态模式虽然类图还尼玛和策略模式⼏乎⼀样,但是策略⽬的是针对单⼀算法的运⾏时替换,客户端需要事先了解策略,主动去选择合适的策略,不存在状态的⾃动迁移!责任链模式与状态模式 1、定义:责任链Chain of Responsibility(CoR)——责任链模式,也叫职责链模式或者职责连锁模式,同状态模式⼀样,也是对象的⾏为模式之⼀,该模式构造⼀系列分别担当不同的职责的类的对象来共同完成⼀个任务,对象由每⼀个对象对其下家的引⽤⽽连接起来形成⼀条链,这些类的对象之间像链条⼀样紧密相连,⽽客户端发出的请求在这个链上传递,直到链上的某⼀个对象决定处理此请求,发出这个请求的客户端并不知道链上的哪⼀个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,所以该模式被称作职责链模式。

 责任链模式特点是各个职责类(类⽐状态模式的状态类们)职责单⼀不彼此依赖,且职责⾃动转移,但是和状态模式不同的是,责任链模式的责任类不知道⾃⼰的下⼀个需要转移到的职责是哪个,等价于——发出完成某任务请求的客户端并不知道链上的哪⼀个对象最终处理这个请求,这个组装过程需要交给环境类去完成,所以⾮常灵活! ⽐如客户Client要完成⼀个任务,这个任务包括a,b,c,d四个部分,⾸先客户Client把任务交给A,A完成a部分之后,把任务交给B,B完成b部分……直到D完成d部分。

责任链模式 选择题

责任链模式 选择题

责任链模式选择题
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. 信号量。

责任链模式详解

责任链模式详解

责任链模式详解定义:责任链模式是⼀条⽤户定义的链条,链条上每个节点都有⾃⼰的责任,当有任务进⼊时,从第⼀个节点开始处理,如果处理成功,则终⽌往下传递任务,否则将会把任务传递给下⼀个节点,依次类推,直⾄最后⼀个节点。

⼀起来看⼀个⼩例⼦:BaseCase:public interface BaseCase {void doSomeThing(String json,CaseChain baseCase);}CaseChain:public class CaseChain {private List<BaseCase>mBaseCaseList = new ArrayList<>();private int index = 0;public CaseChain addCase(BaseCase baseCase){mBaseCaseList.add(baseCase);return this;}public void start(String json){if (index == mBaseCaseList.size()){return;}BaseCase baseCase = mBaseCaseList.get(index);index++;baseCase.doSomeThing(json,this);}}OneCase:public class OneCase implements BaseCase{@Overridepublic void doSomeThing(String json,CaseChain CaseChain) {if (json.equals("json")){System.out.println("1处理好了");return;}CaseChain.start(json);}}TwoCase:public class TwoCase implements BaseCase{@Overridepublic void doSomeThing(String json,CaseChain CaseChain) {if (json.equals("xml")){System.out.println("2处理好了");return;}CaseChain.start(json);}}Test:public class Test {public static void main(String[] args){CaseChain caseChain = new CaseChain();caseChain.addCase(new OneCase()).addCase(new TwoCase()).start("xml");}}。

责任链模式校验参数用法-概述说明以及解释

责任链模式校验参数用法-概述说明以及解释

责任链模式校验参数用法-概述说明以及解释1.引言1.1 概述责任链模式是一种软件设计模式,用于解耦发送者和接收者之间的关系。

在该模式中,多个对象依次处理同一个请求,直到其中一个对象能够处理该请求为止。

这种机制可以使请求的发送者与接收者之间的耦合度降低,同时提高系统的灵活性和可扩展性。

校验参数是软件开发中十分常见的操作,它用于验证用户输入的数据是否符合预期的要求。

参数校验的重要性在于保证系统的安全性和稳定性,避免了不合法的参数进入系统,从而防止了潜在的安全风险和逻辑错误。

责任链模式在校验参数中具有广泛的应用。

通过使用责任链模式,可以将不同的参数校验逻辑划分为一系列独立的节点,每个节点专门负责一个具体的校验操作。

当一个参数被提交进行校验时,它会依次经过这些节点,每个节点都可以根据自己的业务逻辑进行参数校验,并对校验结果进行处理。

如果某个节点能够处理该参数,则校验流程终止;如果所有节点都无法处理该参数,则表示参数校验失败。

责任链模式在校验参数中的应用具有以下优势:1. 解耦性高:责任链模式将校验逻辑拆分为多个节点,各节点之间相互独立,通过定义好的接口进行交互,降低了各节点之间的耦合度。

2. 可扩展性强:通过增加或删除节点,可以方便地对参数校验的流程进行扩展或修改,满足不同场景下的需求变化。

3. 灵活性好:每个节点可以自行决定是否处理该参数,以及如何处理。

因此,可以根据具体的业务需求,对参数校验的流程进行定制化处理,提高了系统的灵活性和可维护性。

1.2文章结构1.2 文章结构本文主要介绍了责任链模式在参数校验中的应用,通过以下几个方面进行阐述。

首先,引言部分会对整篇文章进行一个概述,介绍责任链模式以及校验参数的重要性,明确文章的目的和意义。

其次,正文部分将分为三个主要部分进行讲解。

首先,我们会详细介绍责任链模式的定义和原理,包括责任链模式的基本结构、角色以及工作流程。

然后,我们将重点探讨校验参数在软件开发中的重要性,包括对输入数据的合法性进行校验以保证系统的安全性和稳定性。

责任链模式——精选推荐

责任链模式——精选推荐

责任链模式责任链模式责任链模式:使多个对象都有机会处理请求,从⽽避免了请求的发送者和接收者之间的耦合关系。

将这些对象连成⼀条链,并沿着这条链传递该请求,直到有对象处理它为⽌。

责任链模式的重点在“链”,由抽象类中的⽅法决定由那个实现类处理该请求,并返回结果,其通⽤类图如下:抽象的处理者Handler实现三个职责:⼀个是定义⼀个请求的处理⽅法handleRequest(),唯⼀对外开放的⽅法;⼀个是定义⼀个链的编排⽅法setLevel(),即处理请求的先后顺序,还有设置和获取当前类的处理等级;第三个是定义了具体的请求者必须实现的具体处理任务response()。

通⽤类图的源码如下:public class Request {//定义当前请求的处理等级private int level;public Request(){this.level = 1; //默认处理等级为1}public void setLevel(int level){this.level = level;}public int getLevel(){return this.level;}}public abstract class Handler {private Handler nextHandler;private int level;protected void setNextHanlder(Handler handler){this.nextHandler = handler;}//模板⽅法,判断请求级别和当前处理的级别public final String handlerRequest(Request request){if(request.getLevel() == this.level)return response(request);else{if(this.nextHandler != null)return this.nextHandler.handlerRequest(request);elsereturn "请求处理失败";}}protected int getLevel(){return this.level;}protected void setLevel(int level){this.level = level;}//抽象处理⽅法,具体在⼦类中实现protected abstract String response(Request request);}public class ConcreteHandler1 extends Handler{@Overrideprotected String response(Request request) {// TODO Auto-generated method stubreturn "第⼀个处理者处理请求";}}public class ConcreteHandler2 extends Handler{@Overrideprotected String response(Request request) {// TODO Auto-generated method stubreturn "第⼆个处理者处理请求";}}public class Client {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubRequest request = new Request();//request.setLevel(3);Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();handler1.setLevel(1);handler2.setLevel(2);handler1.setNextHanlder(handler2);System.out.println(handler1.handlerRequest(request));}}优点:责任链模式的优点是将请求和处理分开,请求者可以不⽤知道谁去处理,处理者不⽤知道请求的全貌,两者解耦,提⾼系统灵活性。

责任链模式——精选推荐

责任链模式——精选推荐

责任链模式什么是职责链模式使多个对象都有机会处理请求。

从⽽避免请求的发送者和接受者之前的耦合关系。

将这个对象连成⼀条链,并沿着这条链传递该请求,直到有⼀个对象处理它为⽌。

职责链模式的重⼼是在“链”上,由⼀条链去处理相似的请求在链中决定谁来处理这个请求,并返回对应的结果。

通⽤类图Handler:抽象处理者。

⼀是定义⼀个请求的处理⽅法handleMessage,唯⼀对外开放的⽅法。

⽽是定义⼀个链的编排⽅法setNext,设置下⼀个处理者;三是定义了详细的请求者必须实现的两个⽅法:定义⾃⼰可以处理的级别getHandlerLevel和详细的处理任务。

Client类:对责任模式进⾏封装,直接返回链中的第⼀个处理者。

详细链的设置不须要⾼层次模块关系,这样降低模块间的耦合,提⾼系统的灵活性。

通⽤代码abstract class Handler{protected Handler successor;public void SetSuccessor(Handler successor){this.successor = successor;}public abstract void HandleRequest(int request);}class ConcreteHandler1 : Handler{public override void HandleRequest(int request){if (request >= 0 && request < 10){Console.WriteLine("{0} 处理请求 {1}",this.GetType().Name, request);}else if (successor != null){successor.HandleRequest(request);}}}class ConcreteHandler2 : Handler{public override void HandleRequest(int request){if (request >= 10 && request < 20){Console.WriteLine("{0} 处理请求 {1}",this.GetType().Name, request);}else if (successor != null){successor.HandleRequest(request);}}}class ConcreteHandler3 : Handler{public override void HandleRequest(int request){if (request >= 20 && request < 30){Console.WriteLine("{0} 处理请求 {1}",this.GetType().Name, request);}else if (successor != null){successor.HandleRequest(request);}}}⽜⼑⼩试在此以机房收费系统学⽣下机计算消费⾦额为例,来实现职责链模式。

责任链模式的具体应用

责任链模式的具体应用

责任链模式的具体应⽤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”,每个扫描业务具体类,需要实现此⽅法,并对条码进⾏处理。

责任链模式实现的三种方式

责任链模式实现的三种方式

责任链模式实现的三种⽅式责任链模式责任链模式的定义:使多个对象都有机会处理请求,从⽽避免请求的发送者和接受者之间的耦合关系,将这个对象连成⼀条链,并沿着这条链传递该请求,直到有⼀个对象处理他为⽌。

这⾥就不再过多的介绍什么是责任链模式,主要来说说java中如何编写。

主要从下⾯3个框架中的代码中介绍。

servlet中的filterdubbo中的filtermybatis中的plugin 这3个框架在实现责任链⽅式不尽相同。

servlet中的Filterservlet中分别定义了⼀个 Filter和FilterChain的接⼝,核⼼代码如下:public final class ApplicationFilterChain implements FilterChain {private int pos = 0; //当前执⾏filter的offsetprivate int n; //当前filter的数量private ApplicationFilterConfig[] filters; //filter配置类,通过getFilter()⽅法获取Filterprivate Servlet servlet@Overridepublic void doFilter(ServletRequest request, ServletResponse response) {if (pos < n) {ApplicationFilterConfig filterConfig = filters[pos++];Filter filter = filterConfig.getFilter();filter.doFilter(request, response, this);} else {// filter都处理完毕后,执⾏servletservlet.service(request, response);}}}代码还算简单,结构也⽐较清晰,定义⼀个Chain,⾥⾯包含了Filter列表和servlet,达到在调⽤真正servlet之前进⾏各种filter逻辑。

设计模式【15】--从审批流中学习责任链模式

设计模式【15】--从审批流中学习责任链模式

设计模式【15】--从审批流中学习责任链模式已经来到了责任链模式,各位客官听我瞎扯......责任链模式是什么责任链模式是⼀种设计模式。

在责任链模式⾥,很多对象由每⼀个对象对其下家的引⽤⽽连接起来形成⼀条链。

请求在这个链上传递,直到链上的某⼀个对象决定处理此请求。

发出这个请求的客户端并不知道链上的哪⼀个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

(百度百科)责任链模式是⼀种⾏为型设计模式,也就是重点是处理数据,假设我们有⼀份数据,需要经过很多个节点处理,那么就会是以下这个样⼦:⼀个节点处理完之后,交给下⼀个节点,不知道⼤家有没有使⽤过审批流,当我们提完⼀个审批单后,你的leader审批,leader审批通过之后就是总监批,总监后⾯可能是⾼级总监,或者cto,或者hr。

他们在同⼀个链条上,倘若你的leader没有审批完,后⾯的节点是不可能收到信息的。

如果你的leader拒绝了你的申请,那数据也不会到达后⾯的审批节点。

如果你接触过前端,JS 中点击某个 div 的时候会产⽣冒泡事件,也就是点击下⾯的A, A 在B⾥⾯,B在C⾥⾯, A-> B -> C 会依次收到点击事件:再举个例⼦,在 SpringMVC中,我们有时候会定义⼀些拦截器,对请求进⾏预处理,也就是请求过来的时候,会依次经历拦截器,通过拦截器之后才会进⼊我们的处理业务逻辑代码。

之前,在做⼈员管理的时候,有涉及到⼈员离职情况的处理流程,要交接⼯作,解除权限,禁⽤账号等等,这整个处理流程就很适合使⽤责任链来处理。

当然,⾃动处理流程是会出错的,保存每⼀个阶段的状态,针对出错的场景,可以⼿动去从断开责任链的地⽅接着执⾏。

这整个流程的框架就是应⽤了责任链,但是根据实际场景也添加了不少其他的东西。

两点疑问责任链的每⼀个节点是不是⼀定包含下⼀个节点的引⽤?答:不⼀定,要么把所有责任节点放在⼀个list⾥⾯,依次处理;要么每个节点包含下⼀个责任节点的引⽤,责任链到底是不允许中断还是不允许中断?答:两种都可以,不拘泥于细节,可以根据⾃⼰的场景使⽤。

枚举责任链模式

枚举责任链模式

枚举责任链模式全文共四篇示例,供读者参考第一篇示例:责任链模式是一种行为设计模式,它允许一系列对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合。

这种模式中,请求会沿着一个链条传递,直到有一个对象处理它为止。

这种模式可以提供更大的灵活性和降低耦合度。

在责任链模式中,通常会有一个处理请求的接口,每个处理器都会实现这个接口。

当一个请求到来时,它会先传递给第一个处理器,如果第一个处理器没有处理它,那么它会被传递给下一个处理器,直到有一个处理器能够处理这个请求。

枚举责任链模式是责任链模式的一种变体。

在枚举责任链模式中,责任链中的处理器是固定的,而且它们的顺序是事先确定的。

这种模式适用于处理固定数量的请求,并且每个请求都有固定的处理流程。

枚举责任链模式通常通过枚举类型实现,每个枚举值代表一个处理器。

这样可以保证责任链中的处理器是固定的,不会随意增加或删除。

通过枚举类型可以确保责任链中的处理器的执行顺序是固定的。

枚举责任链模式在实际项目中有着广泛的应用。

比如在电商系统中,订单的处理流程是一个典型的责任链模式。

订单在提交后,需要经过一系列处理,比如订单校验、库存检查、支付处理等。

这些处理流程就可以通过枚举责任链模式来实现。

另一个应用场景是在权限控制系统中。

不同的用户可能有不同的权限,而权限控制系统可以通过责任链模式来实现。

每个处理器代表一种权限级别,请求会依次传递给不同的处理器,直到找到一个能够处理该请求的处理器为止。

枚举责任链模式是一种简单而有效的设计模式,它可以帮助我们实现复杂的处理流程,降低组件之间的耦合度,提高系统的灵活性和可维护性。

在实际项目中,我们可以根据具体情况选择是否使用枚举责任链模式来实现系统的功能。

第二篇示例:枚举责任链模式是一种设计模式,它主要用于解决对象之间的关系及其行为的问题。

在这种模式中,每个对象都有一个自己的责任,并对其自己的责任负责。

如果这个对象无法处理这个责任,它将把责任传递给下一个对象,直到责任被处理为止。

责任链模式——精选推荐

责任链模式——精选推荐

一、引言初看责任链模式,心里不禁想起了一个以前听过的相声:看牙。

说的是一个病人看牙的时候,医生不小心把拔下的一个牙掉进了病人嗓子里。

病人因此楼上楼下的跑了好多科室,最后无果而终。

责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。

至于到底谁解决了这个问题了呢?我管呢!二、定义与结构从名字上大概也能猜出这个模式的大概模样——系统中将会存在多个有类似处理能力的对象。

当一个请求触发后,请求将在这些对象组成的链条中传递,直到找到最合适的“责任”对象,并进行处理。

《设计模式》中给它的定义如下:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

从定义上可以看出,责任链模式的提出是为了“解耦”,以应变系统需求的变更和不明确性。

下面是《设计模式》中给出的适用范围:1) 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

2) 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

3) 可处理一个请求的对象集合应被动态指定。

责任链模式真的能给发送者和接收者之间解耦(这好像很神奇)吗?先来看下它的组成角色。

这个问题我会在下面提及。

责任链模式由两个角色组成:1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。

当然对于链子的不同实现,也可以在这个角色中实现后继链。

2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。

如果不能处理则访问它的后继者。

至于类图不放也罢。

毕竟就是一个继承或者实现。

三、纯与不纯责任链模式的纯与不纯的区别,就像黑猫、白猫的区别一样。

不要刻意的去使自己的代码来符合一个模式的公式。

只要能够使代码降低耦合、提高重用,满足系统需求并能很好的适应变化就好了。

正所谓:管它黑猫白猫,抓住老鼠就是好猫!纯的责任链模式,规定一个具体处理者角色只能对请求作出两种动作:自己处理;传给下家。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

7.4.2 责任链模式的适用性
1.可能处理请求的对象集合以及它们在链表中 的顺序是由客户端根据当前应用的状态在运 行时动态决定的。
2.客户端根据现在的状态,对于不同的请求类 型,可以拥有不同的可能处理请求的对象集 合。一个处理请求的对象也可以根据客户应 用的状态和请求类型,把请求传递给不同的 处理对象。
7.4.2 责任链模式的意图和适用性
3.客户对象初始化请求,或者在不知道这些 对象是否能处理这个请求的情况下初始化 任何可能处理请求的对象。也就是说,客 户对象和在处理链表中的处理对象都不需 要知道到底哪个对象去处理这个请求。 4.请求不能保证被处理。也就是,在没有处 理的情况下,请求已经到达了处理链表尾, 怎么办?
7.4.2 责任链模式的意图和适用性
aA发送请求,aB处理该请求 思考:怎么编程?
aA
aB
Int request Send(aB, request) { aB.handle(request) } request handle(r)
方案一:建立依赖关系 此种方案画蛇添足,因为如果aA拥有aB的指针,则可以直接调用aB 的handle,不必多写方法send
7.4.4 应用举例
// "Handler" abstract class Handler { // Fields protected Handler successor; // Methods public void SetSuccessor( Handler successor ) { this.successor = successor; } abstract public void HandleRequest( int request ); } // "ConcreteHandler1" class ConcreteHandler1 : Handler { // Methods override public void HandleRequest( int request ) { if( request >= 0 && request < 10 ) Console.WriteLine("{0} handled request {1}", this, request ); else if( successor != null ) successor.HandleRequest( request ); } }
抽象
Int request aB.handelrequest(request)
aC
Handlerequest(r)
*successor Setsuccessor() successor.handelrequest(r)
责任链模式的类图
aA Handler *aB
handler
Handler *successor
1) 优点:责任链模式的最大的一个有点就是 给系统降低了耦合性,请求的发送者完全 不必知道该请求会被哪个应答对象处理, 极大地降低了系统的耦合性。 2) 缺点:消息传递和处理不当会出现消息的 循环重复执行。
7.4.2 责任链模式的意图和适用性
aA aB *aB Handlerequest(r) *successor Setsuccessor() successor.handelrequest(r)
Int request aB.handelrequest(request)
终极方案 aB aC..可抽象为类了
Int request aB.handelrequest(request)
+setsuccessor() +handlerequest()
7.4.2 责任链模式的意图和适用性Fra bibliotek模式的意图
为解除请求的发送者和接收者之间耦合,而使多个对 象都有机会处理这个请求。将这些对象连成一条链,并沿 着这条链传递该请求,直到有一个对象处理它。
// Client test public class Client { public static void Main( string[] args ) { // Setup Chain of Responsibility Handler h1 = new ConcreteHandler1(); Handler h2 = new ConcreteHandler2(); Handler h3 = new ConcreteHandler3(); h1.SetSuccessor(h2); h2.SetSuccessor(h3); // Generate and process request int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 }; foreach( int request in requests ) h1.HandleRequest( request ); } }
7.4.2 责任链模式的意图和适用性
aA
aB
*aB Int request aB.handelrequest(request) Handlerequest(r)
方案二:正解 aA发送请求,aB处理该请求 进一步思考:如果有很多个接受者要怎么办?
7.4.2 责任链模式的意图和适用性
aC aA
aB
*aB *aC *aD Int request aB.handelrequest(request) aC….. aD 思考:这样做的缺陷?有没有其他办法? Handlerequest(r)
7.4.2 责任链模式的意图和适用性
aA aB *aB Handlerequest(r) Int request aB.handelrequest(request)
aC 正解:将多个请求者串成链表,让请求沿链传播
思考:aB和aC如何关联?aB怎么把request发给aC处理?
Handlerequest(r)
aC
Handlerequest(r)
*successor Setsuccessor() successor.handelrequest(r)
抽象
Handler类
aA aB
*aB Handlerequest(r) *successor Setsuccessor() successor.handelrequest(r)
7.4 责任链模式(Chain of Responsibility) 【实验】
一、责任链模式的由来 二、责任链模式的意图及适用性 三、责任链模式的结构及参与者 四、应用举例 五、效果分析
7.4.2 责任链模式的意图和适用性
aA
aB
Int request request
aA对象发送请求,aB对象处理该请求 思考:怎么编程?
aD
Handlerequest(r)
7.4.2 责任链模式的意图和适用性
aA aB *aB Handlerequest(r) *aC aC.handelrequest(r)
Int request aB.handelrequest(request)
不好的方案:aB按aA的方式设计 aC 思考:这样处理的缺陷是什么? 答:这样造成aB,aC.无法抽象为类 Handlerequest(r)
7.4.3 责任链模式的结构和参与者
7.4.3 责任链模式的结构和参与者:
1) 抽象处理者角色(Handler):它定义了一个处理请求的 接口。当然对于链子的不同实现,也可以在这个角色中实 现后继链。
2)
具体处理者角色(Concrete Handler):实现抽象角色中 定义的接口,并处理它所负责的请求。如果不能处理则访 问它的后继者。
递归
// "ConcreteHandler2" class ConcreteHandler2 : Handler { override public void HandleRequest( int request ) { if( request >= 10 && request < 20 ) Console.WriteLine("{0} handled request {1}", this, request ); else if( successor != null ) successor.HandleRequest( request ); } } // "ConcreteHandler3" class ConcreteHandler3 : Handler { override public void HandleRequest( int request ) { if( request >= 20 && request < 30 ) Console.WriteLine("{0} handled request {1}", this, request ); else if( successor != null ) successor.HandleRequest( request ); } }
责任链模式并不创建责任链。责任链的创建必须由系统的 其它部分创建出来。 责任链模式降低了请求的发送端和接收端之间的耦合,使 多个对象都有机会处理这个请求。一个链可以是一条线, 一个树,也可以是一个环。如下图所示,责任链是一个树 结构的一部分。
思考:如何将请求传递给每个处理者?
7.4.5 效果分析
相关文档
最新文档