从JDK中学习设计模式——策略模式

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

概述

策略模式(Strategy Pattern)是通过一些独立的类来封装一系列算法,并且它们之间可以相互转换。每一个算法称为一种策略或政策,因此又称为政策模式(Policy Pattern),是一种对象行为型模式

策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开,为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做规则的定义,而每种算法则对应于一个具体策略类,使用算法的环境类是针对抽象策略类进行编程的。

结构

策略模式UML.png

  • Context(环境类):是使用算法的角色,维持了抽象策略类的引用。
  • Strategy(抽象策略类):声明了所有具体策略类的公共方法,一般是抽象类或接口,但也可以是具体类。
  • ConcreteStrategy(具体策略类):实现了在抽象策略类中声明的算法。

优点

  1. 将策略的定义与使用分开,有利于关注点的分离
  2. 避免了使用多重条件判断,有利于系统的维护
  3. 新增策略不必修改环境类,符合开闭原则
  4. 策略模式的环境类通过聚合使用策略,减少了继承的使用
  5. 抽象策略类提供了算法复用的机制,避免了重复的代码

缺点

  1. 当策略过多时,会造成类的膨胀
  2. 所有的策略类都需要对外暴露,不符合迪米特法则
  3. 在客户端中无法组合使用多个策略类

应用场景

  1. 系统需要动态地在几种算法中选择一种。
  2. 系统需要屏蔽算法的具体规则。
  3. 多个类只有在算法或行为上稍有不同的场景,通过策略模式可以避免使用难以维护的多重条件选择语句。

JDK 中的应用

在 JDK 中 java.util.Comparator 就使用了策略模式。

java.util.Comparator 就是抽象策略类:

1
2
3
4
java复制代码@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}

java.util.Arrays 是环境类:

1
2
3
4
5
6
7
8
9
10
11
12
java复制代码public class Arrays {    
public static <T> void sort(T[] a, Comparator<? super T> c) {
if (c == null) {
sort(a);
} else {
if (LegacyMergeSort.userRequested)
legacyMergeSort(a, c);
else
TimSort.sort(a, 0, a.length, c, null, 0, 0);
}
}
}

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%