在我們平時的編碼工作中,經常會有一些流程步驟基本相同,只是中間有部分細節不同的業務流程,比如我們自己要實現乙個基於redis快取的模版方法,在redis中存在指定值時,則返回redis中快取的資料;如果redis中不存在,則查詢db,並把查詢所得快取起來,並返回查詢所得。這個例子就是用模版模式再好不過了,直接上**:
1.定義模版類
@component
public abstract class rediscachetemplate else else }}
} else
} // 返回查詢資料
return target;
} /**
* 鉤子方式,供使用者實現,判斷是否要查詢資料庫,預設不查db
* * @return false
*/protected boolean issearchdb() ;
/*** 鉤子方法,設定過期時間
* * @return 預設-1l:不過期
*/protected long timeout() ;
/*** 設定過期時間單位
* * @return 預設timeunit.hours
*/protected timeunit timeouttimeunit() ;
/*** 檢視db邏輯,供使用者實現
* * @return db查詢結果
*/protected abstract t searchfromdb();
}
通常,因為模版方式需要一些鉤子方法,或者其他需要業務方自己實現的具體方法,我們一般將模版類定義為抽象類,提供供業務實現的抽象方法,或者定義乙個protect的方法,返回預設值,必要時由業務方重寫該方法。
2.業務方定製具體細節
@component
public class servicebootrediscachetemplate extends rediscachetemplate
//若需要查詢db,則實現查詢db的邏輯
@suppresswarnings("unchecked")
@override
protected taskresponsedto searchfromdb()
}
3.使用我們的快取模版
public string test()
乙個簡單的模版模式就實現了,是不是很簡單!
補充2點:
1.如果查詢db需要引數,也很簡單,提供的抽象方法帶引數即可。也可以在我們具體實現的servicebootrediscachetemplate 中定義需要的引數變數,提供set方法,也可實現該功能
2.我們第一次查詢快取,如果沒有命中的話,我們就會查詢資料庫,如果查詢資料庫也沒有滿足條件的資料,即db查詢返回null,如果不設定預設值在緩衝中,則每次這樣的查詢都會走db,我們的快取模版也就沒有意義了。最好的做法是,如果db查詢不到,我們在快取中設定乙個指定的預設值,業務方根據返回的值做相應的業務邏輯。
設計模式之模版模式
模板方法模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。模版方法模式 父類宣告抽象方法,子類做具體實現 父類引用指向子...
設計模式 模版模式
模板方法模式是類的行為模式。準備乙個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。模板類public abstract class templa...
JAVA設計模式 模版模式
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...