设计模式之策略模式 - strategy

作者: ahking17 | 来源:发表于2017-02-23 18:26 被阅读32次
典型的案例

在构造PriorityQueue优先级队列时,使用

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

给优先级队列指定一个元素的排序规则的比较器.

例如可以实现2个比较器, 一个是按照元素的某一个属性值进行正向排序, 另一个是按照元素的某一个属性值进行反向排序.
当以后需要新的排序规则时, 只需要实现Comparator接口里的方法, 并设置给PriorityQueue就可以了, 之前的代码都不需要修改.

这样就做到了对扩展开发, 对修改封闭.
这就是策略模式.

在android 属性动画中的使用

使用属性动画时, 有一个插值器的概念, 用于根据时间流逝的百分比, 计算出属性值要改变的百分比.

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

通过给属性动画指定一个插值器, 实现不同动画速度的快慢变化.

public interface TimeInterpolator {

    float getInterpolation(float input);
}

默认提供了这么几种实现

LinearInterpolator, DecelerateInterpolator, AccelerateInterpolator, AccelerateDecelerateInterpolator

使用策略模式的优点是, 当需要新的插值器时, 只需要MyTimeInterpolator implements TimeInterpolator, 然后set到animation中去就可以了. 原有的插值器的代码都不需要修改.
这样就做到了对修改封闭, 对扩展开放的原则.

对Volley的灵活性修改

volley使用一个PriorityBlockingQueue存储外界的网络请求对象, 它在构造优先级队列的时候并没有指定比较器, 这些对象的排序是按照FIFO先进先出的方式存储.
通过在构造PriorityBlockingQueue的时候指定一个比较器, 可以对网络请求对象进行正向或反向的排序. 在滑动listview时, 可以让后添加进来的网络请求先被执行, 这样用户可见区的item最快得到展示, 能够提升一定的用户体验.

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<?>>();

}

用这个构造方法, 给PriorityBlockingQueue提供一个比较器.

    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);
    }
}

如果比较器不为空的话, 调用比较器的compare()方法对元素进行排序, 如果比较器为空的话, 那就直接调用对象的compareTo()方法, 对元素进行排序.

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

相关文章

  • 简说设计模式之策略模式

    前言:对于设计模式基础概念可以去看[简说设计模式之设计模式概述] 一、什么是策略模式 策略(Strategy)模式...

  • 策略模式

    本文参考自: 《JAVA设计模式》之策略模式(Strategy) 1. 作用 策略模式属于对象的行为模式。其用意是...

  • 设计模式-策略模式

    设计模式-策略模式 定义 策略模式(Strategy Pattern)也叫政策模式(Policy Pattern)...

  • 设计模式[13]-策略模式-Strategy Pattern

    1.策略模式简介 策略模式(Strategy Patter)是行为型(Behavioral)设计模式,策略模式封装...

  • Java设计模式之策略模式

    Java设计模式之策略模式 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行...

  • iOS 设计模式-策略模式

    1.策略模式简介   策略模式(Strategy Pattern),是行为型模式之一(设计模式分类:https:/...

  • 设计模式之策略模式(Strategy)

    1. 什么是策略模式? 策略模式 定义了算法族,分别封装起来, 让它们之间可以互相替换,此模式让算法的变化独立于使...

  • 设计模式之策略模式(Strategy)

    概述 写代码时总会出很多的if…else,或者case。如果在一个条件语句中又包含了多个条件语句就会使得代码变得臃...

  • 设计模式之策略模式Strategy

    策略模式(Strategy Pattern) 一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模...

  • 设计模式之策略模式 - strategy

    典型的案例 在构造PriorityQueue优先级队列时,使用 给优先级队列指定一个元素的排序规则的比较器. 例如...

网友评论

    本文标题:设计模式之策略模式 - strategy

    本文链接:https://www.haomeiwen.com/subject/qqwbwttx.html