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

简介: 策略模式和责任链模式(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、可动态指定一组对象处理请求。



目录
相关文章
|
2月前
|
设计模式 算法 搜索推荐
策略模式的小记
本文介绍了策略模式的概念、结构和使用场景,并通过支付系统的例子展示了如何使用策略模式来动态选择不同的支付策略,包括定义支付策略接口、实现具体的支付策略类、创建上下文类以及在客户端动态选择支付策略。
策略模式的小记
|
3月前
|
设计模式
|
5月前
|
设计模式 JavaScript 前端开发
如何优雅的使用责任链模式?
【6月更文挑战第7天】如何优雅的使用责任链模式?
|
设计模式 Java
设计模式~~~责任链模式(职责链模式)
设计模式~~~责任链模式(职责链模式)
67 0
|
前端开发
策略模式
策略模式
79 0
|
算法 测试技术 C#
C#策略模式
C#策略模式
70 0
|
JavaScript 测试技术
关于责任链模式我所知道的
关于责任链模式我所知道的
82 0
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
87 0
责任链模式简单介绍
责任链模式简单介绍
133 0