設(shè)計(jì)模式之策略模式 - strategy

典型的案例

在構(gòu)造PriorityQueue優(yōu)先級(jí)隊(duì)列時(shí),使用

public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) {
}

給優(yōu)先級(jí)隊(duì)列指定一個(gè)元素的排序規(guī)則的比較器.

例如可以實(shí)現(xiàn)2個(gè)比較器, 一個(gè)是按照元素的某一個(gè)屬性值進(jìn)行正向排序, 另一個(gè)是按照元素的某一個(gè)屬性值進(jìn)行反向排序.
當(dāng)以后需要新的排序規(guī)則時(shí), 只需要實(shí)現(xiàn)Comparator接口里的方法, 并設(shè)置給PriorityQueue就可以了, 之前的代碼都不需要修改.

這樣就做到了對(duì)擴(kuò)展開發(fā), 對(duì)修改封閉.
這就是策略模式.

在android 屬性動(dòng)畫中的使用

使用屬性動(dòng)畫時(shí), 有一個(gè)插值器的概念, 用于根據(jù)時(shí)間流逝的百分比, 計(jì)算出屬性值要改變的百分比.

mUrlHintAnimationIn = ObjectAnimator.ofFloat(mUrlHit,
    "translationY", availableViewportHeight, availableViewportHeight - mUrlHit.getMeasuredHeight());
mUrlHintAnimationIn.setInterpolator(new DecelerateInterpolator());
mUrlHintAnimationIn.start();

通過給屬性動(dòng)畫指定一個(gè)插值器, 實(shí)現(xiàn)不同動(dòng)畫速度的快慢變化.

public interface TimeInterpolator {

    float getInterpolation(float input);
}

默認(rèn)提供了這么幾種實(shí)現(xiàn)

LinearInterpolator, DecelerateInterpolator, AccelerateInterpolator, AccelerateDecelerateInterpolator

使用策略模式的優(yōu)點(diǎn)是, 當(dāng)需要新的插值器時(shí), 只需要MyTimeInterpolator implements TimeInterpolator, 然后set到animation中去就可以了. 原有的插值器的代碼都不需要修改.
這樣就做到了對(duì)修改封閉, 對(duì)擴(kuò)展開放的原則.

對(duì)Volley的靈活性修改

volley使用一個(gè)PriorityBlockingQueue存儲(chǔ)外界的網(wǎng)絡(luò)請(qǐng)求對(duì)象, 它在構(gòu)造優(yōu)先級(jí)隊(duì)列的時(shí)候并沒有指定比較器, 這些對(duì)象的排序是按照FIFO先進(jìn)先出的方式存儲(chǔ).
通過在構(gòu)造PriorityBlockingQueue的時(shí)候指定一個(gè)比較器, 可以對(duì)網(wǎng)絡(luò)請(qǐng)求對(duì)象進(jìn)行正向或反向的排序. 在滑動(dòng)listview時(shí), 可以讓后添加進(jìn)來的網(wǎng)絡(luò)請(qǐng)求先被執(zhí)行, 這樣用戶可見區(qū)的item最快得到展示, 能夠提升一定的用戶體驗(yàn).

public class RequestQueue {
    /** The cache triage queue. */
    private final PriorityBlockingQueue<Request<?>> mCacheQueue =
        new PriorityBlockingQueue<Request<?>>();

    /** The queue of requests that are actually going out to the network. */
    private final PriorityBlockingQueue<Request<?>> mNetworkQueue =
        new PriorityBlockingQueue<Request<?>>();

}

用這個(gè)構(gòu)造方法, 給PriorityBlockingQueue提供一個(gè)比較器.

    public PriorityBlockingQueue(int initialCapacity,
                                 Comparator<? super E> comparator)
public class PriorityQueue<E> extends AbstractQueue<E> implements Serializable {
    private Comparator<? super E> comparator;

    public PriorityQueue() {
        this(DEFAULT_CAPACITY);
    }

    public PriorityQueue(int initialCapacity, Comparator<? super E> comparator) {
        if (initialCapacity < 1) {
            throw new IllegalArgumentException("initialCapacity < 1: " + initialCapacity);
        }
        elements = newElementArray(initialCapacity);
        this.comparator = comparator;
    }

    private int compare(E o1, E o2) {
        if (comparator != null) {
            return comparator.compare(o1, o2);
        }
        return ((Comparable<? super E>) o1).compareTo(o2);
    }
}

如果比較器不為空的話, 調(diào)用比較器的compare()方法對(duì)元素進(jìn)行排序, 如果比較器為空的話, 那就直接調(diào)用對(duì)象的compareTo()方法, 對(duì)元素進(jìn)行排序.

------DONE.-----------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在程序設(shè)計(jì)中,我們也常常遇到這樣的情況,要實(shí)現(xiàn)某一個(gè)功能有多種方案可以選擇。比如一個(gè)壓縮文件的程序,既可以選擇 z...
    風(fēng)銘閱讀 1,573評(píng)論 0 0
  • 策略模式,是我們接觸到的第一個(gè)設(shè)計(jì)模式,也是較容易理解的一個(gè)模式。我們可以給它下一個(gè)定義:** 定義了算法族,分別...
    六尺帳篷閱讀 855評(píng)論 0 8
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,563評(píng)論 19 139
  • 今天學(xué)習(xí)了抽象類和拷貝構(gòu)造函數(shù) class 類名{virtual 類型 函數(shù)名(參數(shù)表)=0;...} 抽象類掌握...
    老翟_4856閱讀 222評(píng)論 0 0
  • 798和花舞森林 人們都說798是藝術(shù)景區(qū)中必看的景點(diǎn),正好去的時(shí)候趕上了花舞森林展覽,就順便也看了。聊聊感受吧,...
    cobs閱讀 360評(píng)論 0 1

友情鏈接更多精彩內(nèi)容