裝飾器模式在mybatis cache包中的應用

2022-04-21 22:10:27 字數 3305 閱讀 5755

裝飾器模式主要解決的是直接繼承下因功能的不斷橫向擴充套件導致子類膨脹的問題,就功能實現來說,使用裝飾器模式比直接繼承顯得更加靈活,同時不需要考慮子類的維護。

上圖為裝飾器模式的組成,可以看出,其主要包含如下部分:

下圖即為mybatis的cache包下的裝飾器實現結構

cache介面定義了快取的一系列操作:

perpetualcache內部使用了hashmap作為cache的儲存結構,原始碼如下:

public

class perpetualcache implements

cache

@override

public

string getid()

@override

public

intgetsize()

@override

public

void

putobject(object key, object value)

@override

public

object getobject(object key)

@override

public

object removeobject(object key)

@override

public

void

clear()

@override

public

readwritelock getreadwritelock()

@override

public

boolean

equals(object o)

if (this ==o)

if (!(o instanceof

cache))

cache othercache =(cache) o;

return

getid().equals(othercache.getid());

} @override

public

inthashcode()

return

getid().hashcode();

}}

org.apache.ibatis.cache.decorators即為裝飾類的存放路徑,通過實現裝飾類對功能的擴充套件,實現了各種策略的快取實現。可以觀察下圖來檢視其擴充套件細節:

結合原始碼,簡要分析一下部分裝飾類的實現:

public

class lrucache implements

cache

@override

public

string getid()

@override

public

intgetsize()

public

void setsize(final

intsize)

return

toobig;}};

} @override

public

void

putobject(object key, object value)

@override

public

object getobject(object key)

@override

public

object removeobject(object key)

@override

public

void

clear()

@override

public

readwritelock getreadwritelock()

private

void

cyclekeylist(object key)

}}

lrucache為一種具有lru策略的快取實現類,其keymap屬性型別繼承自linkedhashmap,用於保持鍵值對的插入順序。

public

class blockingcache implements

cache

@override

public

string getid()

@override

public

intgetsize()

@override

public

void

putobject(object key, object value)

finally

} @override

public

object getobject(object key)

return

value;

} @override

public

object removeobject(object key)

@override

public

void

clear()

@override

public

readwritelock getreadwritelock()

private

reentrantlock getlockforkey(object key)

private

void

acquirelock(object key)

} catch

(interruptedexception e)

} else

} private

void

releaselock(object key)

} public

long

gettimeout()

public

void settimeout(long

timeout)

}

blockingcache實現阻塞特性,其底層是基於可重入鎖reentrantlock實現的。

還有其他的很多裝飾類,可以結合原始碼自行分析。

裝飾器模式

大話設計模式 裝飾器模式 為已有功能動態地新增更多功能,當系統需要新功能,向舊的類中新增新功能,裝飾了原有類的核心職責和行為,而不改變它們 就像包裝袋一樣,有 的包裝袋包裝之前裝好東西的包裝袋 ifndef clothes h define clothes h include using names...

裝飾器模式

裝飾器設計模式 對真實物件動態的新增功能 抽象元件 author zhangjianbin public inte ce icar 俱體構件物件 真實的物件 author zhangjianbin class car implements icar 裝飾器物件 author zhangjianbin...

裝飾器模式

一 概念 裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該 盡量使用物件組合,而不是物件繼承來擴...