职责链模式

目录

  • 职责链模式
      • 分析
    • 应用场景
    • 代码实现
    • 实例
      • 代码
      • 单元测试
      • 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设计模式——职责链模式相关推荐

  1. Python设计模式-职责链模式

    Python设计模式-职责链模式 代码基于3.5.2,代码如下; #coding:utf-8 #职责链模式class Handler():def __init__(self):self.success ...

  2. 第二十章 Caché 设计模式 职责链模式

    文章目录 第二十章 Caché 设计模式 职责链模式 定义 优点 缺点 结构图 描述 完整示例 请求类 抽象责任类 实现责任类 调用 思考 第二十章 Caché 设计模式 职责链模式 定义 使多个对象 ...

  3. C++设计模式-职责链模式

    目录 基本概念 代码与实例 在哪种地方使用 基本概念 职责链模式(Chain of Responsibility):时多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连 ...

  4. JAVA 设计模式 职责链模式

    用途 职责链模式 (Chain Of Responsibility) 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这个对象连成一条链,并沿着这条链传递该请求,直到有一个 ...

  5. PHP设计模式——职责链模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对 ...

  6. 设计模式|职责链模式--流程状态审批(枚举实现)

    流程审批 在实际的项目中,我们经常会涉及到某个对象实体的状态转换,比如合同审批,请假审批,订单流程状态流转,由于本文不涉及工作流(Activiti,Zeebe)的介绍,只是介绍职责链模式的设计模式,因 ...

  7. C++设计模式——职责链模式(responsibility chain pattern)

    一.原理讲解 1.1意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2应用场景 有多个对象可以处 ...

  8. 设计模式---职责链模式(Chain of Responsibility Pattern)

    目录 1.学校 OA系统采购审批需求 2.传统方式解决审批流程 3.传统 方式 问题分析 4.职责链模式基本介绍 5.职责链模式原理类图 6.职责链模式解决OA采购审批 7.职责链模式在SpringM ...

  9. 设计模式-职责链模式

    1.定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到对象处理它为止.    相信大家都写过if...else或者swit ...

最新文章

  1. HDU 1022[Train Problem I] 栈的应用
  2. HDOJ 1016 HDU 1016 Prime Ring Problem ACM 1016 IN HDU
  3. 11.17 模拟:总结
  4. 文档排序模型--查询似然Query Likelihood
  5. 常用字符串处理函数汇总
  6. Unix/Linux 目录结构的来历
  7. 目标检测——夏侯南溪模型搭建篇
  8. C++ mutable 的用法
  9. lightroom classic破解版
  10. 天勤2022数据结构(一)线性表
  11. 计算机系统常见的10个硬件 1故障,计算机十项常见故障
  12. android手机品牌排行,智能手机品牌排行榜2019前十名
  13. 页面浏览量和点击量_如何计算页面浏览量
  14. 2021 年第一个双月总结
  15. 游戏服务器开发环境搭建
  16. HDU 6461 hzy 和zsl 的生存挑战(博弈)
  17. android xposed如何写,安卓Hook系列教程(一):xposed模块开发环境搭建
  18. ubuntu的学习记录-安装vmtols,更换软件源,开启远程服务
  19. 360度全景的地拍如何制作?
  20. 公有云与私有云的区别(转)

热门文章

  1. HTML标签汇总(基础表格部分)
  2. Jquery点击事件连续执行多次
  3. Conflux伍鸣破题公链困境:联盟链服务商业团体 公链服务中小商户
  4. Php部分常见问题总结 [ http://www.phpx.com/happy/top38769.html ]
  5. mysql分页用乘号出错_PHP分页碰到的问题
  6. mysqladmin 创建数据库
  7. 已拦截跨域请求 浏览器_浏览器拦截跨域请求处理方法
  8. Jquery实现页面滚动时导航智能定位
  9. 学习笔记(2):Python语言家族-所有语言通用的循环-2
  10. windows 下mysql备份脚本