Java設計模式之模板模式(Template )

總李寫程式碼發表於2016-06-07

前言:

   最近學習了Glide開源圖片快取框架,在學習到通過使用ModelLoader自定義資料來源的時候,Glide巧妙的使用了Java的模板模式來對外暴露處理不同的Url資料來源,今天來學習總結一下模板模式。

模板模式(Template ):

      模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體建構函式的形式實現,然後宣告一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。這就是模板方法模式的用意。

模式中的角色

    抽象類(AbstractClass):實現了模板方法,定義了演算法的骨架。
    具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的演算法。
 

模式模式舉例說明:

 上述可以我們學習模板模式的動機來源於Glide,那我們就來模擬Glide定義不同的資料來源模板來舉例

 1.)先定義下載抽象類AbstractImageLoader 

public abstract class AbstractImageLoader {

    //抽象類定義整個流程骨架
    public final void downloadImage(String imageUrl,int width,int height){
        //先獲取最終的資料來源URL
        String finalImageUrl=getUrl(imageUrl,width,height);
        //然後開始執行下載
    }
    //以下是不同子類根據自身特性完成的具體步驟
    protected abstract String getUrl(String imageUrl,int width,int height);
}

 

2.)具體類實現

WebpImageLoader 

public class WebpImageLoader extends  AbstractImageLoader {
    @Override
    protected String getUrl(String imageUrl, int width, int height) {
        return String.format("%s?imageView2/1/w/%d/h/%d/format/webp", imageUrl, width, height);
    }
}

JpgImageLoader

public class JpgImageLoader extends  AbstractImageLoader {
    @Override
    protected String getUrl(String imageUrl, int width, int height) {
        return String.format("%s?imageView2/1/w/%d/h/%d/format/jpg", imageUrl, width, height);
    }
}

3.)具體使用

 String imageUrl = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg";
 AbstractImageLoader loader =new  WebpImageLoader();
 loader.downloadImage(imageUrl,200,200);

模式模式優缺點:

1.)優點

模板方法模式通過把不變的行為搬移到超類,去除了子類中的重複程式碼。子類實現演算法的某些細節,有助於演算法的擴充套件。通過一個父類呼叫子類實現的操作,通過子類擴充套件增加新的行為,符合“開放-封閉原則”。
 

2.)缺點

每個不同的實現都需要定義一個子類,這會導致類的個數的增加,設計更加抽象。
 

3.)適用場景

在某些類的演算法中,用了相同的方法,造成程式碼的重複。控制子類擴充套件,子類必須遵守演算法規則。
 
小結:
    簡單總結了模板模式,今天也是端午節前的最後一篇部落格,端午節快樂。

 

相關文章