装饰器模式和责任链模式区别

news/2024/5/19 12:15:29 标签: 装饰器模式, 责任链模式

近期看了 mybatis 的源码,发现二级缓存这块用了装饰器模式将各个功能的缓存进行嵌套,源码上也是讲到使用了装饰器模式,但是看着跟责任链模式类似,本着搞清楚的想法,搜了很多资料,看了书籍《Head First 设计模式》上对于装饰器模式责任链模式的讲解,思考如下

装饰器模式

特点

通过委托来实现(一般是定义了一个 delegate 变量来引用定义的操作的接口),流程中的各个节点都参与了处理,运行时动态处理。

使用场景

适用于灵活变动需要组合处理的情况,即协作处理,各个节点无阻塞,直到执行到最底层的节点,需要反馈会逆序返回。

编码形式

简单,对于执行的操作只需要调用一次即可,各个具体装饰类实现会链式调用委托对象的方法进行处理。

使用案例

spring 中的 aop 实现的事务管理和日志管理。

书籍《Head First 设计模式》上对于装饰器模式用了一个饮料加配料的例子来讲解这个问题。

责任链模式

特点

各个节点经过了流转,但是不一定进行了处理(能处理就处理,不能处理就走过场转交给别人),即使处理了不一定有结果。自己处理不了的交给别人。

使用场景

适用于对于某些操作可能指定了一系列操作步骤(例如审批),各个步骤都需要执行。

编码形式

麻烦,对于执行的操作每个过程需要编码实现。

使用案例

工作流审批

javaee 中的 filter chain

参考链接

https://blog.csdn.net/qq_42449106/article/details/131542919

https://blog.csdn.net/jiadajing267/article/details/106889562

https://www.cnblogs.com/darope/p/12695256.html


http://www.niftyadmin.cn/n/5287685.html

相关文章

uniapp常见的标签

1.view view 是 uni-app 中最基本的组件之一,用于在页面中创建一个视图容器。它类似于 HTML 中的 div 标签,可以用来包裹其他组件或者作为布局容器使用 2.text text 用于显示文本内容,类似于 HTML 中的 span 标签。可以设置字体大小、颜色、…

【Linux系统基础】(5)在Linux上集群化环境前置准备及部署Zookeeper、Kafka软件详细教程

集群化环境前置准备 介绍 在前面,我们所学习安装的软件,都是以单机模式运行的。 后续,我们将要学习大数据相关的软件部署,所以后续我们所安装的软件服务,大多数都是以集群化(多台服务器共同工作&#xf…

LeetCode 75| 前缀和

目录 1732 找到最高海拔 724 找到数组的中心下标 1732 找到最高海拔 class Solution { public:int largestAltitude(vector<int>& gain) {int res 0;int sum 0;for(int num : gain){sum num;res max(res,sum);}return res;} }; 时间复杂度O(n) 空间复杂度O(…

A novel local-global dependency deep learning model for soil mapping

程哥的一区文章 “A novel local-global dependency deep learning model for soil mapping” (Li 和 Zhang, 2022, pp. -) (pdf) 研究问题&#xff1a;“工 程 “ discrete” 特征不能反映环境协变量 之间 的相 互作 用或 依赖 关系” (pdf) 预测的对象是土壤质地的预测。属于…

【JavaScript】异步解决方案的发展历程

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

【PHP】使用Redis对API进行限流

目录 1.连接Redis服务器&#xff1a; 2.定义限流策略&#xff1a; 3.使用Redis数据结构进行计数&#xff1a; 4.&#xff08;可选&#xff09;使用Redis的更复杂数据结构&#xff1a; 5.&#xff08;可选&#xff09;使用Redis的Lua脚本&#xff1a; 6.注意 在PHP中使用R…

低代码:拒绝重复、低价值的工单循环开发

一、前言 在软件开发和其他工程领域&#xff0c;“重复造轮子”被广泛认为是一种低效的做法&#xff0c;因为它浪费了大量的时间和资源去重新创作已经存在的东西&#xff0c;而不是利用现有的技术和经验去解决问题。 例如在大平台项目的实战开发中&#xff0c;针对不同业务场景…

引用iframe提示禁止访问后,再也打不开网站

django项目&#xff0c;测试环境runserver时启用了81作为端口&#xff0c;A页面通过iframe引用B页面&#xff0c;访问A页面&#xff0c;提示禁止访问。然后打开任何页面都提示“可能暂时无法连接” 禁止访问原因&#xff1a;settings.py中忘记配置 X_FRAME_OPTIONS SAMEORIGIN…