设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例

本文主要是介绍设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                    设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它将请求的发送者与接收者解耦,让多个接收者对象形成一条链,并沿着这条链传递请求,直到有一个接收者处理它为止。每个接收者都有权决定是否处理请求,或者将请求转发给链上的下一个接收者。

结构:

  • Handler(处理者)接口/抽象类: 定义处理请求的接口,通常包含一个处理请求的方法(如 handleRequest()),以及一个设置或获取下一个处理者的方法(如 setNext() 和 getNext())。
  • ConcreteHandler(具体处理者): 实现处理者接口,负责处理特定类型的请求。每个具体处理者在处理请求时,可以选择处理请求、拒绝处理(通常通过返回特定值或抛出异常表示)或将其转发给下一个处理者。

原理: 

        请求发起者只需将请求发送给链上的第一个处理者,后续的传递过程完全由链上的处理者自行决定。每个处理者检查请求是否符合其处理条件,若符合则处理并终止传递,否则将请求转发给下一个处理者。这样,请求的发送者无需关心请求如何被处理,处理的责任分散在链上的各个处理者中。

优缺点:

  • 优点

    • 发送者与接收者解耦,增加系统的灵活性,易于扩展新的处理者或调整处理顺序。
    • 便于实现请求的分发、过滤、路由等功能。
    • 通过在链上动态地添加或删除处理者,可以改变系统的处理行为。
  • 缺点

    • 链条过长可能导致请求处理的效率下降。
    • 如果处理链的构造不合理,可能会导致请求得不到处理(例如,链中没有能够处理该请求的处理者)。
    • 调试较为困难,因为请求的处理过程可能涉及多个处理者。

场景:

  • 处理请求可能有多种方式或多种条件,需要在运行时动态确定。
  • 不希望请求发送者与接收者之间存在紧密耦合。
  • 需要对请求进行过滤、分发、路由等操作。

 代码示例(以Java为例)

在责任链模式中,决定下一个处理者的责任通常由处理者自身承担。具体而言,每个处理者在处理请求时,可以根据请求的内容、自身的处理能力等因素,判断是否需要将请求传递给链上的下一个处理者。下面是一个Java实现的例子,展示了处理者如何决定下一个处理者:

// 处理者接口
public abstract class Handler {protected Handler nextHandler;public void setNext(Handler handler) {this.nextHandler = handler;}public abstract void handleRequest(Request request);
}// 具体处理者A
public class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(Request request) {if (canHandle(request)) {// 处理请求...System.out.println("ConcreteHandlerA handled the request.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("No suitable handler found for the request.");}}private boolean canHandle(Request request) {// 根据请求内容判断处理者A是否能处理该请求// 这里仅作为示例,实际逻辑应根据业务需求实现return request.getType().equals("TypeA") && request.getPriority() >= 5;}
}// 具体处理者B
public class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(Request request) {if (canHandle(request)) {// 处理请求...System.out.println("ConcreteHandlerB handled the request.");} else if (nextHandler != null) {nextHandler.handleRequest(request);} else {System.out.println("No suitable handler found for the request.");}}private boolean canHandle(Request request) {// 根据请求内容判断处理者B是否能处理该请求// 这里仅作为示例,实际逻辑应根据业务需求实现return request.getType().equals("TypeB") && request.getPriority() <= 8;}
}// 请求类
public class Request {private String type;private int priority;// ... 构造函数、getters、setters ...
}// 使用示例
public class Client {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();handlerA.setNext(handlerB);  // 构建责任链Request requestA = new Request("TypeA", 7);  // 创建请求对象ARequest requestB = new Request("TypeB", 6);  // 创建请求对象BhandlerA.handleRequest(requestA);  // 发起请求AhandlerA.handleRequest(requestB);  // 发起请求B}
}

        在这个例子中,ConcreteHandlerA 和 ConcreteHandlerB 分别实现了 canHandle() 方法,用于判断是否能处理给定的请求。在 handleRequest() 方法中,每个处理者首先检查自己是否能处理请求,如果可以,则处理请求并终止传递;否则,将请求传递给下一个处理者。这种设计使得每个处理者都能根据请求内容自主决定是否处理或传递请求,从而实现了责任链模式的核心思想。

这篇关于设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949849

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序