三、策略模式在源码中的应用
策略模式在框架源码中的体现:
首先来看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、可动态指定一组对象处理请求。