了解,什么是装饰者模式?

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之设计模式之装饰者模式相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. 前端也要学系列:设计模式之装饰者模式

    什么是装饰者模式 今天我们来讲另外一个非常实用的设计模式:装饰者模式.这个名字听上去有些莫名其妙,不着急,我们先来记住它的一个别名:包装器模式. 我们记着这两个名字来开始今天的文章. 首先还是上< ...

  3. 设计模式 之 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 装饰者模式 装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对 ...

  4. 【设计模式】装饰者模式 ( 概念 | 适用场景 | 优缺点 | 与继承对比 | 定义流程 | 运行机制 | 案例分析 )

    文章目录 I . 装饰者模式概念 II . 装饰者模式适用场景 III . 装饰者模式优缺点 IV . 装饰者模式与继承对比 V . 装饰者模式相关设计模式 VI . 装饰者模式四个相关类 VII . ...

  5. 设计模式学习----装饰器模式

    这两天本来是自在学习java collection Framework的Fail Fast底层机制,看到核心的部分时,突然意识到设计模式的问题,上大学到现在我还没有真正理解过设计模式的概念,于是用了大 ...

  6. 【设计模式】装饰器模式的使用

    问题来源 我们在进行软件系统设计的时候,有一些业务(如下图,一些通用的非功能性需求)是多个模块都需要的,是跨越模块的.把它们放到什么地方呢? 最简单的办法就是把这些通用模块的接口写好,让程序员在实现业 ...

  7. C#设计模式(9)——装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

  8. go设计模式之装饰器模式

    go设计模式之装饰器模式 再写这篇文章时,我已经看了很多其他人发表的类似文章,大概看了这么多吧. 亓斌的设计模式-装饰者模式(Go语言描述) jeanphorn的Golang设计模式之装饰模式 七八月 ...

  9. python中的装饰器、装饰器模式_python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

最新文章

  1. 如何使用RecyclerView构建Horizo​​ntal ListView?
  2. fiddler修改接口请求返回数据Response的三种方法
  3. [ZT ref=null]Javascript的IE和Firefox兼容性汇编
  4. 利用python处理中国地面气候资料日值数据集(V3.0)
  5. Number.isInteger()
  6. vs的windows应用程序上的鼠标为什么一直是加载状态?_了解 JavaScript 应用程序中的内存泄漏...
  7. 浏览器cookie怎么清除,彻底清除上网痕迹只需这几步
  8. Ubuntu 20.04 搭建hadoop 集群
  9. 【学术】论文返修时,能否增加作者或变更作者顺序?
  10. 阿里妈妈Dolphin分布式向量召回技术详解
  11. MapReduce实现倒排索引(Inverted Index)
  12. 原生webgl学习(六) WebGL写简单的汉字(一)
  13. 银行外汇资金业务学习笔记(3)spot rate (即期汇率)和 forward rate(远期汇率)
  14. 2022年上半年全球知名企业十大数据泄露事件
  15. 语音信号线性预测分析(MATLAB实战篇)
  16. 2015 重庆市赛 解题报告
  17. 微信公众号开发——关注公众号自动回复
  18. Win7下配置MySql定时自动备份
  19. 2019第十届蓝桥杯-决赛-Java大学-C组
  20. windows10安装python3.7.4_win10肿么安装python3.4.1

热门文章

  1. enkey java_近期的Java项目(前端)
  2. shields 徽标_符号,标志,文字标记:徽标类型的综合指南
  3. 重新设计Videoland的登录页面— UX案例研究
  4. 这些 JS 中强大的操作符,总有几个你没听说过
  5. 得到鹅厂最新前端开发手册一份
  6. 如何移除项目中无用的 console.log 代码
  7. 听说现在都考这些React面试题
  8. Flutter RichText支持自定义文字背景
  9. Hadoop-Flume-类比吸尘器图解
  10. Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)