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


前言:

   最近學習了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.)適用場景

在某些類的算法中,用了相同的方法,造成代碼的重復。控制子類擴展,子類必須遵守算法規則。
 
小結:
    簡單總結了模板模式,今天也是端午節前的最后一篇博客,端午節快樂。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM