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

news2025/1/17 3:40:04

文章目录

  • 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 main

import (
	"fmt"
)

// 定义抽象处理者
type Handler interface {
	handleRequest() string
}

// 定义实际处理者A
type ConcreteHandlerA struct {
	name string
	next 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 string
	next 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, nil
	case "B":
		handler = &ConcreteHandlerB{
			name: name,
			next: next,
		}
		return handler, nil
	default:
		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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1104371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5款CSS3选项框单选按钮样式(走过路过不要错过)

5款CSS3选项框单选按钮样式是一款创意好看的选项单选按钮样式特效。 样式如下: 文章顶部就是源码,如果下载不了(如果被弄成收费or要VPI才能下载)私一下我,第一次弄csdn的资源绑定,不行我重新弄成网盘的 百…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件

本节对应的视频讲解:B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.7 拖动事件 本章要实现的整体效果如下: QEvent::DragEnter ​ 当拖动文件进入到窗口/控件中时,触发该事件,它对应的子类是 QDragEnterEvent QEvent::DragLe…

IDEA2023.1版本新建Web项目并配置本地Tomcat

IDEA2023.1版本新建Web项目并配置本地Tomcat 一、新建Web项目 一、新建Web项目 由于我最初是新建了一个空项目作为工作空间的,所以这里选择直接新建module,如下所示。(这里使用的是idea的newUI) 新建module,输入信息…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 今天讲一下wf_demo表单的一些修改 1、demo的实现类修改如下: 主要是增加一个服务名称&#…

学信息系统项目管理师第4版系列30_信息系统管理

1. 管理方法 1.1. 技术底座构成了几乎所有业务模式的支柱 1.2. 信息系统是为组织用来生产和管理信息(数据)的技术(“什么”)、人员(“谁”)和过程(“如何”)的组合 1.3. 信息系统…

【nginx学习笔记】

1.正向代理:代理的是客户端,一般有明确的访问对象 比如:我现在通过v-p-n去访问YouTube,那么就是正向代理。 2.反向代理:代理的是服务器 最常见的就是web中,nginx去代理一群后端的服务器。 3.负载均衡&…

mac虚拟机,无法从apple store下载软件

问题:vmware版本为16pro,mac版本为10.14.6,网络可以正常访问互联网,apple id也正常登录了,但是从apple store下载软件,转了一会圈,就停掉了。 解决:后面使用了一个网上看到的方法&a…

ESDA in PySal (4):shape-measures:形状测量

ESDA in PySal (4):shape-measures:形状测量 1.Measures of shape esda.shape 模块提供文献中使用的统计数据来测量多边形的结构和规则性。 这些测量值从非常简单(例如长宽差)到非常复杂(例如归一化转动惯量&#xf…

以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦!!! 现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。 Now everythi…

【4】c++11新特性(稳定性和兼容性)—>final关键字

c中增加了final关键字来限制某个类不能被继承&#xff0c;或者某个虚函数不能被重写。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且放在类或者函数的后面。 修饰函数 #include <iostream> using namespace std;class Base { public:virtual void t…

在 Ubuntu 22.04安装配置 Ansible

一、按官网指引安装 我使用的ubuntu22.04版本&#xff0c;使用apt安装。官网指引如下&#xff1a; $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible 由于内部网络…

《动手学深度学习 Pytorch版》 9.1 门控循环单元(GRU)

我们可能会遇到这样的情况&#xff1a; 早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c;目标是在序列的末尾辨别校验和是否正确。在这种情况下&#xff0c;第一个词元的影响至关重要。我们希望有…

《数理统计》第4章

文章目录 第4章4.4.1 协方差 第4章 4.4.1 协方差

项目平台——测试报告的实现(七)

这里写目录标题 一、Table表格组件的使用1、Table表格组件中的插槽使用 二、点击查看测试报告&#xff0c;跳转到测试报告详情页实现1、新建Report.vue组件2、配置路由3、查看报告按钮添加事件 三、页面布局1、Layout布局2、卡片设计3、打开页面发送请求加载报告数据4、对接口进…

如何优化前端可访问性(Accessibility)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

如何修复-谷歌浏览器-打开任何一个网页都显示崩溃

早上上班&#xff0c;一如既往的使用谷歌浏览器时&#xff0c;发现异常。 首先是&#xff0c;右下角有个弹窗提示某某插件需要点击更新&#xff0c;然后点了也没用&#xff0c;然后就是打开任何网页都提示‘喔唷 崩溃了’的字眼。 奇怪呀&#xff0c;咱也是第一次碰见这种问题…

使用Proxyman抓取Android的https请求

使用Proxyman抓取Android的https请求 有时&#xff0c;您可能需要测试您的移动应用程序并检查与其关联的所有网络请求。在网络上&#xff0c;此任务非常简单&#xff0c;只需按Ctrl Shift I打开开发人员工具即可。从那里&#xff0c;您可以导航到网络选项卡并检查与网页相关的…

绝对有效,牛津《书虫》全系列完整版( 电子书+MP3 )

&#x1f600;前言 因为像看一下牛津《书虫》系类的&#xff08;PDF和音频&#xff09;找了许久不是链接过期就是要密码要会员太烦了所以在这里整理好打包给大家 在文章末尾 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大…

java打包解包总结

使用别人的jar包程序&#xff0c;需要修改其中的相关参数然后重新打包&#xff0c;在此记录一下打包和解包过程。 目录 1.解包操作 2.打包操作 1.解包操作 原始jar包文件 解包 jar xvf test.jar 或者 jar -xvf test.jar 2.打包操作 原始文件 打包&#xff1a; jar cvM0…

Aroid问题笔记 - ViewPager嵌套RecyclerView,降低ViewPager灵敏度

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…