裝飾器模式主要解決的是直接繼承下因功能的不斷橫向擴充套件導致子類膨脹的問題,就功能實現來說,使用裝飾器模式比直接繼承顯得更加靈活,同時不需要考慮子類的維護。
上圖為裝飾器模式的組成,可以看出,其主要包含如下部分:
下圖即為mybatis的cache包下的裝飾器實現結構
cache介面定義了快取的一系列操作:
perpetualcache內部使用了hashmap作為cache的儲存結構,原始碼如下:
publicorg.apache.ibatis.cache.decorators即為裝飾類的存放路徑,通過實現裝飾類對功能的擴充套件,實現了各種策略的快取實現。可以觀察下圖來檢視其擴充套件細節: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();
}}
結合原始碼,簡要分析一下部分裝飾類的實現:
publiclrucache為一種具有lru策略的快取實現類,其keymap屬性型別繼承自linkedhashmap,用於保持鍵值對的插入順序。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)
}}
publicblockingcache實現阻塞特性,其底層是基於可重入鎖reentrantlock實現的。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)
}
還有其他的很多裝飾類,可以結合原始碼自行分析。
裝飾器模式
大話設計模式 裝飾器模式 為已有功能動態地新增更多功能,當系統需要新功能,向舊的類中新增新功能,裝飾了原有類的核心職責和行為,而不改變它們 就像包裝袋一樣,有 的包裝袋包裝之前裝好東西的包裝袋 ifndef clothes h define clothes h include using names...
裝飾器模式
裝飾器設計模式 對真實物件動態的新增功能 抽象元件 author zhangjianbin public inte ce icar 俱體構件物件 真實的物件 author zhangjianbin class car implements icar 裝飾器物件 author zhangjianbin...
裝飾器模式
一 概念 裝飾模式能夠實現動態的為物件新增功能,是從乙個物件外部來給物件新增功能。通常給物件新增功能,要麼直接修改物件新增相應的功能,要麼派生對應的子類來擴充套件,抑或是使用物件組合的方式。顯然,直接修改對應的類這種方式並不可取。在物件導向的設計中,而我們也應該 盡量使用物件組合,而不是物件繼承來擴...