Java設計模式之模板模式(Template )第二篇

前言:

    最近學習了Glide開源圖片緩存框架,在學習到經過使用ModelLoader自定義數據源的時候,Glide巧妙的使用了Java的模板模式來對外暴露處理不一樣的Url數據源,今天來學習總結一下模板模式。web

模板模式(Template ):

    模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。算法

模式中的角色

    抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。緩存

    具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。框架

 

模式模式舉例說明:

    上述能夠咱們學習模板模式的動機來源於Glide,那咱們就來模擬Glide定義不一樣的數據源模板來舉例ide

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.優勢

模板方法模式經過把不變的行爲搬移到超類,去除了子類中的重複代碼。子類實現算法的某些細節,有助於算法的擴展。經過一個父類調用子類實現的操做,經過子類擴展增長新的行爲,符合「開放-封閉原則」。spa

2.缺點

每一個不一樣的實現都須要定義一個子類,這會致使類的個數的增長,設計更加抽象。.net

3.適用場景

在某些類的算法中,用了相同的方法,形成代碼的重複。控制子類擴展,子類必須遵照算法規則。設計

    幹咱們這行,啥時候懈怠,就意味着長進的中止,長進的中止就意味着被淘汰,只能往前衝,直到鳳凰涅槃的一天!

相關文章
相關標籤/搜索