設計跟圖片套件切割的方式

  • 24
  • 0

最近剛好遇到一個問題 是在於圖片的套件要升級版本的問題

最近剛好遇到一個問題 Android 的圖片常用套件"Glide"要升級套件的問題,在"程式設計人應該知道的 97 件事"書中 慎選工具的這一篇提到 "用介面和分層,將外部工具和業務領域物件分離" 必須得讓我的程式跟工具有分層,這樣子我才能用極少的代價去替換它。

所以剛好遇到升級套件的問題,而構想了這樣子的設計

package com.example.tim_wu.myapplication.util;

import android.widget.ImageView;

public class ImageLoader implements IImageLoader {
    private static ImageLoader ourInstance;
    private IImageLoader mImageLoader;

    private ImageLoader() {
        mImageLoader = new GlideImageLoader();
    }

    public static ImageLoader getInstance() {
        if (null == ourInstance) {
            ourInstance = new ImageLoader();
        }
        return ourInstance;
    }

    @Override
    public void loadImage(String url, ImageView target) {
        mImageLoader.loadImage(url, target);
    }

    @Override
    public void loadImage(String url, int placeholder, ImageView target) {
        mImageLoader.loadImage(url, placeholder, target);
    }

    @Override
    public void loadImageWithCenterCrop(String url, int placeholder, ImageView target) {
        mImageLoader.loadImageWithCenterCrop(url, placeholder, target);
    }
}

第一段程式碼是我們的主要ImageLoader,設計成 Singleton 讓使用的地方可以直接使用。

package com.example.tim_wu.myapplication.util;

import android.widget.ImageView;

import com.bumptech.glide.Glide;

public class GlideImageLoader implements IImageLoader {

    @Override
    public void loadImage(String url, ImageView target) {
        Glide.with(target.getContext()).load(url).into(target);
    }

    @Override
    public void loadImage(String url, int placeholder, ImageView target) {
        Glide.with(target.getContext()).load(url).placeholder(placeholder).into(target);
    }

    @Override
    public void loadImageWithCenterCrop(String url, int placeholder, ImageView target) {
        Glide.with(target.getContext()).load(url).centerCrop()
                .placeholder(placeholder).into(target);
    }
}

第二段程式是主要實作Glide這個套件的地方 其實只要在這邊去實作Glide就好了, 外部不用特別知道裡面是如何實作的 只需要將Url and ImageView帶進來就好

package com.example.tim_wu.myapplication.util;

import android.widget.ImageView;

public interface IImageLoader {
    void loadImage(String url, ImageView target);

    void loadImage(String url, int placeholder, ImageView target);

    void loadImageWithCenterCrop(String url, int placeholder, ImageView target);
}

第三段程式碼其實是我定義loadImage的行為 在後續要新增的時候 可以直接在這邊新增

雖然範例中是以Glide為例子但是難保好幾年後是不是又有更新的圖片套件出來,所以後面的人維護時只需要更換ImageLoader就可以快速的換掉使用圖片的地方達到容易維護的目的