先上圖片西采。
根據(jù)圖片來說一下其中的想法。(注:圖中的service指的是業(yè)務(wù)層)
1. 真實(shí)的緩存對象存放在Cache類中,被protected修飾,CacheProxy類實(shí)際不儲存任何緩存對象买鸽,其與Cache類同包,并為外部提供public方法訪問Cache贯被。
a.Protected修飾保證只有CacheProxy可以訪問Cache類眼五。在協(xié)同開發(fā)中就不用擔(dān)心有人繞過了你的設(shè)計直接訪問Cache。
b.CacheProxy可以提供更加豐富的方法彤灶,比如緩存中是個List對象看幼,根據(jù)需要Facade可以提供將其變?yōu)閙ap并返回的方法』仙拢或者為了保證原緩存對象不被修改诵姜,取對象的時候深拷貝一個對象并返回。
2. CacheManagerService負(fù)責(zé)統(tǒng)一更新緩存的邏輯苞轿。
a. 更新緩存的邏輯,涉及到怎么取需要的數(shù)據(jù)逗物,怎么存搬卒。怎么取數(shù)據(jù)這一步主要是業(yè)務(wù)邏輯,不應(yīng)該在CacheManageService中實(shí)現(xiàn)翎卓,應(yīng)該定義一個接口契邀,由另外一個類去實(shí)現(xiàn)。CacheManageService只要負(fù)責(zé)調(diào)用接口(圖中的ExternalDataService/FileDataService/DbDataService)失暴。
這樣做一個是業(yè)務(wù)相關(guān)代碼可以重用坯门,再一個即使這部分業(yè)務(wù)邏輯變了CacheManageService也不受影響(業(yè)務(wù)邏輯很可能變),另外一個其實(shí)也很重要就是使得CacheManageService代碼易讀逗扒。
b. CacheManageService統(tǒng)一負(fù)責(zé)更新古戴,使得更新這一塊邏輯容易修改。比如想加個鎖呀矩肩,換個鎖呀现恼,感覺都不難。
3. MonitorCenter這一塊負(fù)責(zé)監(jiān)控緩存更新條件黍檩,并且觸發(fā)緩存更新(調(diào)用CacheManagerService更新緩存)叉袍。這里我認(rèn)為觀察者模式是很適合的,我將其分為三塊:MonitorCenter類刽酱,Monitor(被觀察者)喳逛,Observer(觀察者)。
a. MonitorCenter類負(fù)責(zé)這個監(jiān)控模塊的初始化棵里,統(tǒng)一注冊觀察者們到Monitor(被觀察者)中润文。程序啟動的時候調(diào)用一下MonitorCenter的初始化方法就行拉(圖中的register方法)姐呐。
b. Monitor負(fù)責(zé)監(jiān)控相關(guān)消息,比如已經(jīng)到每天的凌晨兩點(diǎn)转唉,收到新的消息皮钠,文件有更新。然后通知Observer赠法。
c. Observer負(fù)責(zé)收到通知的時候麦轰,判斷是否要更新,然后觸發(fā)CacheManageService的相關(guān)更新方法砖织。
判斷是否要更新這個邏輯是要放在Observer中的款侵,比如圖中MessageAObserver和MessageBObserver自己判斷是不是消息A和消息B。試想一下如果放到MessageMonitor中那他需要判斷這個消息是什么侧纯,還要從觀察者列表中找到MessageAObserver新锈,并且保證消息不能發(fā)給MessageBObserver。好吧眶熬,這想想就夠了妹笆,別去做這種事。
4. start娜氏,在程序啟動的時候只需要調(diào)用兩個方法就能使得這個模塊正常運(yùn)行拳缠。一個是CacheManagerService的init方法初始化緩存。一個是MonitorCenter的register方法讓其在合適的時間觸發(fā)緩存的更新贸弥。