典型的案例
在構(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.-----------