策略模式和责任链模式(3)

三、策略模式在源码中的应用


策略模式在框架源码中的体现:


首先来看JDK 中—个比较常用的比较器 Comparator 接口,我们看到的—个大家常用的 compare()


方法,就是一个策略抽象实现 :


public interface Comparator<T> {
    int compare(T o1, T o2);
}


Comparator抽象下面有非常多的实现类,我们经常会把 Comparator作为参数传入作为排序策略,

例如 Arrays 类的 parallelSort 方法等 :


public class Arrays {
    public static void parallelSort(byte[] a) {
        int n = a.length, p, g;
        if (n <= MIN_ARRAY_SORT_GRAN ||
            (p = ForkJoinPool.getCommonPoolParallelism()) == 1)
            DualPivotQuicksort.sort(a, 0, n - 1);
        else
            new ArraysParallelSortHelpers.FJByte.Sorter
            (null, a, new byte[n], 0, n, 0,
             ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?
             MIN_ARRAY_SORT_GRAN : g).invoke();
    }
}


还有 TreeMap 的构造方法:


public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
    public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
}


这就是 Comparator 在JDK原码中的应用。那我们来看策略模式在 Spring源码中的应用,来看

Resource 类 :


public interface Resource extends InputStreamSource {
    boolean exists();

    default boolean isReadable() {
        return true;
    }

    default boolean isOpen() {
        return false;
    }

    default boolean isFile() {
        return false;
    }

    URL getURL() throws IOException;

    URI getURI() throws IOException;

    File getFile() throws IOException;

    default ReadableByteChannel readableChannel() throws IOException {
        return Channels.newChannel(this.getInputStream());
    }

    long contentLength() throws IOException;

    long lastModified() throws IOException;

    Resource createRelative(String var1) throws IOException;

    @Nullable
    String getFilename();

    String getDescription();
}


我们虽然没有直接使用 Resource 类,但是我们经常使用它的子类,例如 :


/*
 * @see WritableResource
 * @see ContextResource
 * @see UrlResource
 * @see ClassPathResource
 * @see FileSystemResource
 * @see PathResource
 * @see ByteArrayResource
 * @see InputStreamResource
 */


四、策略模式的优缺点

优点 :


1 、策略模式符合开闭原则。


2、避免使用多重条件转移语句,如 if…else… 语句、 switch 语句


3、使用策略模式可以提高算法的保密性和安全性。


缺点 :


1 、客户端必须知道所有的策略,并且自行决定使用哪一个策略类。


2、代码中会产生非常多策略类,增加维护难度。


五、责任链模式

责任链模式 (Chain of Responsibility Pattern) 是将链中每一个节点看作是一个对象,每个节点处理

的清求均不同,且内部自动维护—个下—节点对象。当—个清求从链式的首端发出时,会沿看链的路径

依次传递给每—个节点对象,直至有对象处理这个清求为止。属千行为型模式。


原文:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to hand I e the request. Chain the receiving objects and pass the request along the chain until an object handles it.

解释:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,

并沿着这条链传递该请求,直到有一个对象处理它为止。


六、责任链模式的应用场景

在日常生活中责任链梩式还是比较常见的,我们平时工作处理一些事务,往往是各部门协同合作的

完成莘—个任务。而每个部门都有各自的职责,因此,很多时候事谓完成—半,便会转交给下—个部门,

直到所有部门都过一渔之后事谓才能完成。还有我们平时俗话说的过五关、斩六将其实也是一种责任链。


责任链模式主要是解耦了请求与处理,客户只需将清求发送到链上即可,无需关心请求的具体内容

和处理细节,请求会自动进行传递直至有节点对象进行处理。


适用于以下应用场景 :


1 、多个对象可以处理同一清求,但具体由哪个对象处理则在运行时动态决定;


2、在不明确指定接收者的情况下,向多个对象中的—个提交—个请求;


3、可动态指定一组对象处理请求。



上一篇:委派模式与模板模式(1)


下一篇:策略模式和责任链模式(1)