当前位置: 首页 > news >正文

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录

  • 1 概念
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1 概念

责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。

客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求处理链上的对象收到请求后,执行自身业务职责,并将该请求传递到下一个链节点。由于客户端不需要了解责任链上节点对象的具体类型,大大降低了客户端与请求处理对象之间的耦合度。

1.1 角色

抽象处理者(Handler):包含抽象处理方法和一个后续处理者。
具体处理者(ConcreteHandler):实现抽象处理者的处理方法。
请求发送者(Client):向处理者发送请求。

1.2 类图

Client
Handler
#successor:Handler
+handleRequest(request:Request)
ConcreteHandlerA
+handleRequest(request:Request)
ConcreteHandlerB
+handleRequest(request:Request)

2. 代码示例

2.1 设计

  • 定义一个抽象处理者Handler
  • 定义实际处理者ConcreteHandlerAConcreteHandlerB
    • 它们实现了抽象处理者Handler
    • 它继承了另一个处理者(下一个处理者)
    • 它的Option()方法执行它的责任
    • 它的handleRequest()方法组装责任链并执行它的责任
  • 调用
    • 实例化三个实际处理者
    • 使用handleRequest()方法执行责任链

2.2 代码

package mainimport ("fmt"
)// 定义抽象处理者
type Handler interface {handleRequest() string
}// 定义实际处理者A
type ConcreteHandlerA struct {name stringnext Handler
}
//定义一个方法模拟实际处理者A的处理过程
func (c *ConcreteHandlerA) Option() {fmt.Println("执行:" + c.name)
}
//定义一个方法,完成它的处理后,交给下一个实际处理者
func (c *ConcreteHandlerA) handleRequest() string {c.Option()if c.next != nil {return c.next.handleRequest()}return ""
}// 定义实际处理者B(情况和A相同)
type ConcreteHandlerB struct {name stringnext Handler
}func (c *ConcreteHandlerB) Option() {fmt.Println("执行:" + c.name)
}func (c *ConcreteHandlerB) handleRequest() string {c.Option()if c.next != nil {return c.next.handleRequest()}return ""
}//定义一个函数,生产处理者
func NewHandler(name string, next Handler, kind string) (handler Handler, err error) {switch kind {case "A":handler = &ConcreteHandlerA{name: name,next: next,}return handler, nilcase "B":handler = &ConcreteHandlerB{name: name,next: next,}return handler, nildefault:return nil, err}}func main() {//实例化3个实际处理者handlerA1, _ := NewHandler("handlerA1", nil, "A")handlerA2, _ := NewHandler("handlerA2", handlerA1, "A")handlerB1, _ := NewHandler("handlerB1", handlerA2, "B")//使用handleRequest方法依次处理(处理过程我们不可见,但是可以通断点过调试看到)r := handlerB1.handleRequest()fmt.Println(r)
}
  • 执行结果
执行:handlerB1
执行:handlerA2
执行:handlerA1

2.3 类图

Client
«interface»
Handler
+handleRequest() : string
ConcreteHandlerA
+name:string
+next:Handler
+handleRequest() : string
+Option()
ConcreteHandlerB
+name:string
+next:Handler
+handleRequest() : string
+Option()

在这里插入图片描述

相关文章:

《golang设计模式》第三部分·行为型模式-01-责任链模式(Chain of Responsibility)

文章目录 1 概念1.1 角色1.2 类图 2. 代码示例2.1 设计2.2 代码2.3 类图 1 概念 责任链(Chain of Responsibility)是指将客户端请求处理的不同职责对象组成请求处理链。 客户端只需要将请求交付到该链上,而不需要关心链上含有哪些对象。请求…...

环境变量【使用命令行参数引出环境变量】

前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…...

【Java 进阶篇】JavaScript BOM History 详解

当用户浏览网页时,可以使用JavaScript的BOM (Browser Object Model)中的History对象来访问浏览器的历史记录。这个对象允许您在不更改页面的情况下导航到不同的历史记录项,或者查看有关用户访问过的页面的信息。 在本篇博客中,我们将围绕Jav…...

【计算机网络】https协议

文章目录 1 :peach:基本概念:peach:1.1 :apple:什么是HTTPS?:apple:1.2 :apple:什么是加密?:apple:1.3 :apple:常见的加密方式:apple:1.3.1 :lemon:对称加密:lemon:1.3.2 :lemon:⾮对称加密:lemon: 1.4 :lemon:数据指纹:lemon: 2 :peach:HTTPS的⼯作过程…...

React之受控组件和非受控组件以及高阶组件

一、受控组件 受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据 举个简单的例子: class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…...

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采,预计将采购国产5G手机120万台,加上另外两家运营商的集采数量,估计集采数量可能达到300万部,如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市,获益…...

华为云HECS服务器下docker可视化(portainer)

一、docker安装 华为云HECS安装docker-CSDN博客 二、portainer安装 portainer地址:Portainer: Docker and Kubernetes Management Platform 当前portainer分CE(开源版) 和 BE(商业版),用CE即可 1 创建…...

postman发送soap报文示例

一、soap简介 soap是一种基于XML的协议 二、postman发送soap请求 1、发送post请求,url:​​​ https://www.dataaccess.com/webservicesserver/NumberConversion.wso 2、headers设置,添加Content-Type,值为text/xml 添加SOAP…...

力扣-python-两数之和

题解: class Solution(object):def twoSum(self, nums, target):# 遍历列表for i in range(len(nums)):# 计算需要找到的下一个目标数字res target-nums[i]# 遍历剩下的元素,查找是否存在该数字if res in nums[i1:]:# 若存在,返回答案。这里…...

算水质TDS加温度补偿

先上图,就图里这款水质检测,用树莓派3/4的话,要配个温度检测作为温度校正,以及一个adc 元器件。我选ds18b20和ads1115。 再把模拟数据计算过程放一下: 温度检测元器件在农历钟那里提过,就是同款。此处先测个…...

wps/word 如何让表格的标题和表格名称文本(表1-1 xxx)跨页显示(已解决)

第一步: 打开wps 创建一个跨页的表格表格,如下图 第二步 大家都知道 表格标题跨页 就是1)在菜单表格工具 点击重复标题 或者 2)表格属性--》行--》在各页顶端以标题行形式出现,详细如下图。 1) 第一…...

攻防世界web篇-PHP2

直接点击进入到http网页中,会得到这样一个界面 这里,我最开始使用了burp什么包也没有抓到,然后接着又用nikto进行探测,得到的只有两个目录,当时两个目录打开后,一个是fond界面,一个是这个网页的…...

Kotlin中的步长

步长是 Kotlin 中用于迭代区间或集合时控制迭代步进的概念。在 Kotlin 中,我们可以使用 step 关键字来指定迭代时的步长。 在 Kotlin 中,有多种方式可以定义一个区间(Range)。我们将通过以下示例代码来展示不同类型的区间以及如何…...

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…...

通过SPI传输BMI160数据到nrf528xx

目录 主控和外设之间的联系关键示例可能的bug 主控和外设之间的联系 在完成代码之前,我们手里会有两份代码,一份是nrf528xx的SDK,一份是BMI160传感器的SDK,怎么利用SDK完成我们的需求呢?首先我们要搞明白,…...

MAYA教程之建模基础命令介绍

基础命令 视图相关操作 旋转视图 : ALT 鼠标左键平移视图 : ALT 鼠标中键缩放视图 : 滚动鼠标滚轮 或者 ALT 鼠标右键切换视图 : 空格键回到模型 : F 视图状态 选择状态 : Q移动状态 : W旋转状态 : E缩放状态 : R 视图显示 正常显示 : 1正常圆滑同时显示 : 2圆滑显示 …...

文档外发控制与安全:实现高效协作与数据安全的关键

随着企业数据量的不断增加,文档外发成为了一个不可避免的需求。然而,很多企业在文档外发过程中存在着很多问题,如数据泄露、信息误用等。因此,如何保证文档外发的安全性和高效性成为了企业亟待解决的问题。飞驰云联Ftrans的文件收…...

在线课堂知识系统源码系统+前端+后端完整搭建教程

大家好啊,今天罗峰来给大家分享一款在线课堂知识系统源码系统。这款系统的功能十分强大。可以使用手机随时随地地学习,有专业的导师答疑解惑。支持视频,音频,图文章节。以下是部分核心代码图: 系统特色功能一览&#x…...

CSS之布局系列--顶部导航栏二级菜单居中展示

原文网址&#xff1a;CSS之布局系列--顶部导航栏二级菜单居中展示_IT利刃出鞘的博客-CSDN博客 简介 本文介绍CSS将顶部导航栏居中展示并支持二级菜单下拉展示的方法。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-…...

算法通关村第九关黄金挑战——透彻理解二叉树中序遍历的应用

大家好&#xff0c;我是怒码少年小码。 上一篇讲了二分查找&#xff0c;今天我们看看它的难度扩展。 有序数组转为二叉搜索树 LeetCode 108&#xff1a;给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高…...

【算法设计与分析zxd】第7章 贪心法

贪心算法的设计技术 • 每一步的判断都是一个当前最优的抉择&#xff0c;这个抉择计算设计的好坏&#xff0c;决定了算法的成败。 • 多步判断过程&#xff0c;最终的判断序列对应于问题的最优解 • 适用于 能够 由 局部最优达到全局最优的优化问题 【比如 求最短哈密顿回路的…...

CCF CSP认证 历年题目自练Day35

题目一 试题编号&#xff1a; 202305-1 试题名称&#xff1a; 重复局面 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题…...

应用crash时发送广播及信息

一、环境 高通865 Android 10 二、情景 应用崩溃时&#xff0c;将奔溃信息以广播的形式发送 二、代码位置 frameworks/base/core/java/com/android/internal/os/RuntimeInit.java private static class KillApplicationHandler implements Thread.UncaughtExceptionHandle…...

【亲测可用】图像目标识别入门-利用笔记本电脑摄像头识别人脸标记出来采用深度学习模型实现

更高的精度和准确性&#xff0c;可以考虑使用基于深度学习的人脸检测和识别方法&#xff0c;例如基于人脸特征的人脸检测器和具有高识别率的人脸识别模型。下面是使用基于深度学习的人脸检测和识别方法的代码示例&#xff1a; 首先&#xff0c;安装必要的库和模型&#xff1a;…...

数字孪生技术:煤矿运输的未来革命

煤矿是我国能源工业的重要支柱&#xff0c;然而&#xff0c;煤矿运输过程中一直存在着诸多问题&#xff0c;如安全隐患、能源浪费、效率低下等&#xff0c;这不仅对煤矿行业的可持续发展构成威胁&#xff0c;也对环境造成负面影响。因此&#xff0c;数字孪生技术应运而生&#…...

一些bug总结

今天被几个小问题和bug折磨了一天&#xff0c;来总结一下… 权限问题 用vscode连接服务器&#xff0c;如果是在root用户连接的情况下新建的文件/文件夹&#xff0c;然后切换到别的用户的时候去写的代码 可能会遇到各种问题 解决方案是更改文件或文件夹的所有权。这可以通过使用…...

第三章 内存管理 九、基本分段存储管理方式

目录 一、概括 二、什么是分段 三、段表 四、地址转换 五、分段和分页的对比 六、总结 一、概括 基本分段存储管理方式是一种操作系统的内存管理方式&#xff0c;采用这种方式&#xff0c;将进程所需的内存分成若干个段&#xff0c;每个段都可以单独进行管理和保护。 具…...

轻重链剖分+启发式合并专题

Codeforces-741D(Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths) 一棵根为1 的树&#xff0c;每条边上有一个字符&#xff08;a-v共22种&#xff09;。 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串。 求每个子树中…...

IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略

IRC/ML:金融智能风控—信贷风控场景简介、两大场景(贷款场景+信用卡场景)、信用卡评分模型设计、反欺诈检测技术的简介、案例应用之详细攻略 目录 信贷风控简介 信贷风控两大场景...

【学习笔记】RabbitMQ01:基础概念认识以及快速部署

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 一、认识RabbitMQ1.1 消息中间件&#xff08;MQ Message Queue 消息队列1.2 主流的消息中间件1.3 MQ的应用场景1.3.1 异步处理1.3.2 系统解耦1.3.3 流量削峰1.3.4 日志处理 二、RabbitMQ运行环境搭建…...

坪洲网站建设/网站域名综合查询

记录2021919的一个关于企业对数据人才的能力需求的讲座&#xff1a; 算法面试重点考察&#xff1a; 1、反向传播手推 2、CNN公式&#xff08;核心部分&#xff09; why &#xff1f; 3、python ok 会问C 4、重点关注工程能力&#xff0c;包括语法、 设计模式&#xff08…...

百度蜘蛛抓取网站/公司网站建设费

abstractclassPerson{publicintage;publicStringname;publicStringoccupation;//publicPerson()//这里应该不会被调用吧构造方法只会调用一个呀~为什么这里去掉就报错了求大哥指教指教...abstract class Person{public int age;public String name;public String occupation;//…...

优化资源配置/北仑seo排名优化技术

本文来自读者投稿作者&#xff1a;姚远首先我们给出MySQL内存使用的计算公式&#xff1a;MySQL理论上使用的内存 全局共享内存 max_connections线程独享内存。也就是&#xff1a;innodb_buffer_pool_size innodb_log_buffer_size thread_cache_size table_open_cache tabl…...

郴州网站网络推广平台/盘多多网盘搜索

Werb项目地址&#xff1a;Werb/Werb简介&#xff1a;第三方微博更多&#xff1a;作者 提 Bug 标签&#xff1a;weibo-问题说明目前 sina 规定只能设置 15 个测试账号&#xff0c;而且现在单单提供测试账号貌似有很多问题&#xff0c;我建议你&#xff1a;自己去新浪新建一个…...

河南网站排名优化价格/搜狗推广登录平台官网

作为系列文章的第六篇&#xff0c;本篇主要在前文的探索下&#xff0c;针对描述一下 Widget 中的一些有意思的原理。 前文&#xff1a; 一、Dart语言和Flutter基础二、 快速开发实战篇三、 打包与填坑篇四、Redux、主题、国际化五、 深入探索首先我们需要明白&#xff0c;Widge…...

龙湖什么网站做宣传/外贸平台自建站

**章 简介Web应用程序的历史对servlet的支持servlet的优势第二章 HTTP Servlet基础HTTP基础Servlet API制作网页Web应用程序总结第三章 servlet的生命周期servlet的选择servlet重新载入init和destroy单线程模式后台处理启动时载入客户端缓存服务端缓存第四章 获取信息Servl…...