Mybatis之设计模式之装饰者模式
了解,什么是装饰者模式?
1.定义
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
2.特点
1 装饰对象和真实对象有相同的接口。这样客户端对象就能以和真实对象相同的方式和装饰对象交互。2 装饰对象包含一个真实对象的引用(reference)3 装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。4 装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展。
3.适用性
1. 需要扩展一个类的功能,或给一个类添加附加职责。2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
4.优点
1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
5.缺点
1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。
6.模式简化
1. 如果只有一个Concrete Component类而没有抽象的Component接口时,可以让Decorator继承Concrete Component。2. 如果只有一个Concrete Decorator类时,可以将Decorator和Concrete Decorator合 并。
Mybatis 源码分析
如图:
在图中,cachey这个接口类,被所有类实现了
这里有一个比较特别的类----PerpetualCache.class
目录结构:
类结构
由于类太多,这里只晒三个类结构图
这样,大概大家都对这几个类和装饰器了解了吧。
讲解
在mybatis中缓存的功能由接口Cache类定义,使用了装饰器设计模式,存储和缓存的功能由
PerpetualCache类实现,然后通过其他的装饰器来对PerpetualCache类进行缓存策略控制。如上图,可以这样理解,PerpetualCache是基类,其它实现的Cache的类都是对基类的扩
展,也就是装饰来包裹真实的对象。扩展了类的功能,也可以说是附加了一些方法。使得具有很好的灵活性。
说明
用于装饰PerpetualCache的标准装饰器共有8个(全部在 org.apache.ibatis.cache.decorators包中):
1. FifoCache:先进先出算法,缓存回收策略2. LoggingCache:输出缓存命中的日志信息3. LruCache:最近最少使用算法,缓存回收策略4. ScheduledCache:调度缓存,负责定时清空缓存5. SerializedCache:缓存序列化和反序列化存储6. SoftCache:基于软引用实现的缓存管理策略7. SynchronizedCache:同步的缓存装饰器,用于防止多线程并发访问8. WeakCache:基于弱引用实现的缓存管理策略
附加:
一个特殊的装饰器TransactionalCache:事务性的缓存
mybatis缓存同样分为一级缓存和二级缓存:
- 一级缓存,又叫本地缓存,是PerpetualCache类型的永久缓存,保存在执行器中
(BaseExecutor),而执行器又在SqlSession(DefaultSqlSession)中,所以
一级缓存的生命周期与SqlSession是相同的。 - 二级缓存,又叫自定义缓存,实现了Cache接口的类都可以作为二级缓存,所以可配
置如encache等的第三方缓存。二级缓存以namespace名称空间为其唯一标识,被保
存在Configuration核心配置对象中
注意:
二级缓存对象的默认类型为PerpetualCache,如果配置的缓存是默认类型,则mybatis会根据配置自动追加一系列装饰器。
Cache对象之间的引用顺序为:
SynchronizedCache–>LoggingCache–>SerializedCache–>ScheduledCache–>LruCache–>PerpetualCache
mybatis源码 ------https://gitee.com/SmileSnake/...
参数资料
装饰器模式概念
如果有侵权,马上删除
Mybatis之设计模式之装饰者模式相关推荐
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- 前端也要学系列:设计模式之装饰者模式
什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...
- 设计模式 之 装饰者模式
2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...
- 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )
文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...
- 设计模式学习----装饰器模式
这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...
- 【设计模式】装饰器模式的使用
问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...
- C#设计模式(9)——装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
- go设计模式之装饰器模式
go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...
- python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern
#写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...
最新文章
- 如何使用RecyclerView构建Horizo​​ntal ListView?
- fiddler修改接口请求返回数据Response的三种方法
- [ZT ref=null]Javascript的IE和Firefox兼容性汇编
- 利用python处理中国地面气候资料日值数据集(V3.0)
- Number.isInteger()
- vs的windows应用程序上的鼠标为什么一直是加载状态?_了解 JavaScript 应用程序中的内存泄漏...
- 浏览器cookie怎么清除,彻底清除上网痕迹只需这几步
- Ubuntu 20.04 搭建hadoop 集群
- 【学术】论文返修时,能否增加作者或变更作者顺序?
- 阿里妈妈Dolphin分布式向量召回技术详解
- MapReduce实现倒排索引(Inverted Index)
- 原生webgl学习(六) WebGL写简单的汉字(一)
- 银行外汇资金业务学习笔记(3)spot rate (即期汇率)和 forward rate(远期汇率)
- 2022年上半年全球知名企业十大数据泄露事件
- 语音信号线性预测分析(MATLAB实战篇)
- 2015 重庆市赛 解题报告
- 微信公众号开发——关注公众号自动回复
- Win7下配置MySql定时自动备份
- 2019第十届蓝桥杯-决赛-Java大学-C组
- windows10安装python3.7.4_win10肿么安装python3.4.1
热门文章
- enkey java_近期的Java项目(前端)
- shields 徽标_符号,标志,文字标记:徽标类型的综合指南
- 重新设计Videoland的登录页面— UX案例研究
- 这些 JS 中强大的操作符,总有几个你没听说过
- 得到鹅厂最新前端开发手册一份
- 如何移除项目中无用的 console.log 代码
- 听说现在都考这些React面试题
- Flutter RichText支持自定义文字背景
- Hadoop-Flume-类比吸尘器图解
- Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)