最近學習了Glide開源圖片緩存框架,在學習到經過使用ModelLoader自定義數據源的時候,Glide巧妙的使用了Java的模板模式來對外暴露處理不一樣的Url數據源,今天來學習總結一下模板模式。web
模板方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣的子類能夠以不一樣的方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。這就是模板方法模式的用意。算法
抽象類(AbstractClass):實現了模板方法,定義了算法的骨架。緩存
具體類(ConcreteClass):實現抽象類中的抽象方法,已完成完整的算法。框架
上述能夠咱們學習模板模式的動機來源於Glide,那咱們就來模擬Glide定義不一樣的數據源模板來舉例ide
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); }
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); } }
String imageUrl = "http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg"; AbstractImageLoader loader =new WebpImageLoader(); loader.downloadImage(imageUrl,200,200);
模板方法模式經過把不變的行爲搬移到超類,去除了子類中的重複代碼。子類實現算法的某些細節,有助於算法的擴展。經過一個父類調用子類實現的操做,經過子類擴展增長新的行爲,符合「開放-封閉原則」。spa
每一個不一樣的實現都須要定義一個子類,這會致使類的個數的增長,設計更加抽象。.net
在某些類的算法中,用了相同的方法,形成代碼的重複。控制子類擴展,子類必須遵照算法規則。設計
幹咱們這行,啥時候懈怠,就意味着長進的中止,長進的中止就意味着被淘汰,只能往前衝,直到鳳凰涅槃的一天!