前言:
最近學習了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.)適用場景
在某些類的演算法中,用了相同的方法,造成程式碼的重複。控制子類擴充套件,子類必須遵守演算法規則。
小結:
簡單總結了模板模式,今天也是端午節前的最後一篇部落格,端午節快樂。