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 源碼分析

如圖:

clipboard.png

在圖中,cachey這個接口類,被全部類實現了
這裏有一個比較特別的類----PerpetualCache.class

目錄結構:

clipboard.png

類結構

因爲類太多,這裏只曬三個類結構圖

clipboard.png
clipboard.png
clipboard.png

這樣,大概你們都對這幾個類和裝飾器瞭解了吧。

講解

在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對象之間的引用順序爲:git

SynchronizedCache–>LoggingCache–>SerializedCache–>ScheduledCache–>LruCache–>PerpetualCache

mybatis源碼 ------https://gitee.com/SmileSnake/... 算法

參數資料
裝飾器模式概念
若是有侵權,立刻刪除apache

相關文章
相關標籤/搜索