1. 程式人生 > >Java模版方法的另一種實現

Java模版方法的另一種實現

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模版方法的另一種實現