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



目录
相关文章
|
SQL HIVE
Hive分区+根据分区查询
Hive分区+根据分区查询
|
12月前
|
数据可视化 前端开发 JavaScript
可视化工具D3.js
可视化工具D3.js
339 2
|
负载均衡 网络协议 Unix
Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇
Nginx七层(应用层)反向代理:SCGI代理scgi_pass篇
203 1
|
7月前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
10月前
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理
|
移动开发 监控 前端开发
如何从0-1的建设云上稳定性?
本文将从前后端的视角整体看下我们在云上稳定性治理的一些路径和经验。首先从平台的系统架构模型出发,站在全局视角看下整个平台的风险。
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
4431 4
|
机器学习/深度学习 图计算
R语言广义线性模型(GLM)、全子集回归模型选择、检验分析全国风向气候数据
R语言广义线性模型(GLM)、全子集回归模型选择、检验分析全国风向气候数据
|
Linux C++
【代码片段】Linux C++打印当前函数调用堆栈
【代码片段】Linux C++打印当前函数调用堆栈
410 0