Java模版方法的另一種實現
阿新 • • 發佈:2018-04-28
pan strategy 全部 相關 必須 rod () 抽象方法 rate
面試荔枝FM杯具,遂死磕AQS途中發現一個有趣的模版用法,記下來。
模版方法是很重要的設計模式,在數據訪問層、眾多的插件接口都可見其影子,一般的實現都是在模版中定義抽象方法並使用其方法進行算法,讓具體的模版定義定制的功能,類似:
public abstract class Template { public abstract A productA(); private void strategy(){ //...... A a = productA(); //...... } }
然而有時候你可能沒辦法讓productA() 稱為抽象方法,比喻你需要把該方法用在構造器模式中,也就是在靜態內部類模式中時;
然而有時候你的模版可能有多個抽象方法,但不要求子類實現所有抽象方法,只需要實現個別就好了(參考AQS同步器的acquire()和acquireShare()就不需要全部實現)
這個時候也要實現模版方法怎麽辦呢?
下面介紹一種好方法,就是用異常,上代碼
public class Template { public A productA(){ throw new UnsupportedOperationException(); } public B productB(){ throw new UnsupportedOperationException(); }private void strategy(){ //...... A a = productA(); //...... } }
這樣子類如果調用相關方法就會拋出check異常了,如果一個子類的職責需要用到productA,那麽編譯器就會要求A生產方法必須要被重寫或者處理異常。是不是非常完美?
Java模版方法的另一種實現