golang设计模式——职责链模式
职责链模式
目录
- 职责链模式
- 分析
- 应用场景
- 代码实现
- 实例
- 代码
- 单元测试
- Gin 的中间件实现
- 总结
职责链将处理模块串联成链,请求沿着链条被处理,提供了很好的扩展性,而且能够去掉if-else。
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
分析
职责链模式的定义已经将模式说的比较清楚了,一个请求需要被多个对象进行处理,可以将处理对象连成一条链,挨个处理请求。
连成链的方式比较多样,可以用UML中展示的那样,一个处理对象使用SetSuccessor引用下一个处理对象。也可以使用array或者list存储所有处理对象,使用循环方式遍历。
对于第二种方式,是否感觉有些像观察者两者具体实现、目的都差不多,主要区别在观察者模式中的处理对象功能可能完全不相似,而且观察者模式主要负责将信息传递给处理对象即可。职责链模式的处理对象功能一般相似,另外职责链模式也关注请求是否正确被处理。
另外,定义里说”直到有一个对象处理它“也不太准确,有多少对象可以处理请求看具体需求,极端情况下每一个对象都可以处理请求。
职责链模式的核心在于将处理对象整理成链路。
应用场景
如果请求被多个对象进行处理,就可以用职责链模式。具体业务的像敏感词脱敏,框架中的过滤器、拦截器等。
总体感觉框架中使用的比较多一些,研发人员能够快速扩展出自己的过滤器和拦截器。
代码实现
我们仿照Gin,实现Gin的全局中间件功能。
package mainimport "fmt"var status int8 = 0type HandlerFunc func()type HandlersChain []HandlerFunc/*** @Description:*/
type RouterGroup struct {Handlers HandlersChainindex int8
}/*** @Description: 添加中间件,将其组成链式* @receiver group* @param middleware*/
func (group *RouterGroup) Use(middleware ...HandlerFunc) {group.Handlers = append(group.Handlers, middleware...)
}/*** @Description: 链顺序执行* @receiver group*/
func (group *RouterGroup) Next() {for group.index < int8(len(group.Handlers)) {group.Handlers[group.index]()group.index++}
}/*** @Description: 中间件*/
func middleware1() {fmt.Println("全局中间件1执行完毕")
}/*** @Description: 中间件*/
func middleware2() {fmt.Println("全局中间件2执行失败")status = 1
}func main() {r := &RouterGroup{}//添加中间件r.Use(middleware1, middleware2)//运行中间件r.Next()//状态检查if status == 1 {fmt.Println("中间件检查失败,请重试")return}//执行后续流程
}
输出:
➜ myproject go run main.go
全局中间件1执行完毕
全局中间件2执行失败
中间件检查失败,请重试
这是一个简版的中间件执行过程,我将Gin中的Context和RouterGroup合并了。虽然比起真正的执行流程缺乏很多内容,但是核心操作是一致的。
实例
首先我们看一下一个简单的实现模板,然后我们再看看实际上我们常用 web 框架 gin 当中是如何处理请求的
代码
// Package chain 职责链模式
//
golang设计模式——职责链模式相关推荐
- Python设计模式-职责链模式
Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...
- 第二十章 Caché 设计模式 职责链模式
文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...
- C++设计模式-职责链模式
目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...
- JAVA 设计模式 职责链模式
用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...
- PHP设计模式——职责链模式
声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对 ...
- 设计模式|职责链模式--流程状态审批(枚举实现)
流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...
- C++设计模式——职责链模式(responsibility chain pattern)
一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...
- 设计模式---职责链模式(Chain of Responsibility Pattern)
目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...
- 设计模式-职责链模式
1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止. 相信大家都写过if...else或者swit ...
最新文章
- HDU 1022[Train Problem I] 栈的应用
- HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU
- 11.17 模拟:总结
- 文档排序模型--查询似然Query Likelihood
- 常用字符串处理函数汇总
- Unix/Linux 目录结构的来历
- 目标检测——夏侯南溪模型搭建篇
- C++ mutable 的用法
- lightroom classic破解版
- 天勤2022数据结构(一)线性表
- 计算机系统常见的10个硬件 1故障,计算机十项常见故障
- android手机品牌排行,智能手机品牌排行榜2019前十名
- 页面浏览量和点击量_如何计算页面浏览量
- 2021 年第一个双月总结
- 游戏服务器开发环境搭建
- HDU 6461 hzy 和zsl 的生存挑战(博弈)
- android xposed如何写,安卓Hook系列教程(一):xposed模块开发环境搭建
- ubuntu的学习记录-安装vmtols,更换软件源,开启远程服务
- 360度全景的地拍如何制作?
- 公有云与私有云的区别(转)
热门文章
- HTML标签汇总(基础表格部分)
- Jquery点击事件连续执行多次
- Conflux伍鸣破题公链困境:联盟链服务商业团体 公链服务中小商户
- Php部分常见问题总结 [ http://www.phpx.com/happy/top38769.html ]
- mysql分页用乘号出错_PHP分页碰到的问题
- mysqladmin 创建数据库
- 已拦截跨域请求 浏览器_浏览器拦截跨域请求处理方法
- Jquery实现页面滚动时导航智能定位
- 学习笔记(2):Python语言家族-所有语言通用的循环-2
- windows 下mysql备份脚本