1. 策略模式
1.1 介绍
策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。
策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性思想。
策略模式的三个角色:抽象策略角色、具体策略角色、环境角色(对抽象策略角色的引用)
实现步骤:
1.定义抽象角色类(定义好各个实现的共同抽象方法)
2.定义具体策略类(具体实现父类的共同方法)
3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法)
1.2 优缺点
优点
- 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。可通过继承或接口实现代码复用
- 策略模式提供了可以替换继承关系的办法
- 使用策略模式可以避免使用多重条件转移语句。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。
1.3 使用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
- 一个系统需要动态地在几种算法中选择一种
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
1.4 注意事项
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
2. 案例实现
第三个问题是给我们两个数,让我们使用最少次加减乘除后将一个数变成另一个数,记录变化的过程。**遗憾的是,我们没有做出来这道题,因此与宝藏无缘了。**但作为答对前两题的奖励,我们获得了一个金属箱子,里面可能有宝物。
public interface Operation {
int doOperation(int num1, int num2);
}
public class Add implements Operation {
@Override
public int doOperation(int num1, int num2) {
System.out.println("add: " + num1 + "+" + num2);
return num1 + num2;
}
}
public class Subtract implements Operation {
@Override
public int doOperation(int num1, int num2) {
System.out.println("subtract: " + num1 + "-" + num2);
return num1 - num2;
}
}
public class Multiply implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
public class Divide implements Operation {
@Override
public int doOperation(int num1, int num2) {
return num1 / num2;
}
}
public class OperationMachine {
private Operation operation = null;
public OperationMachine() {
}
public void setOperation(Operation operation) {
this.operation = operation;
}
public int executeStrategy(int num1, int num2){
return operation.doOperation(num1, num2);
}
}
/** * 策略模式 * *@Author cly *@Date 2021/08/31 23:52 *@Version 1.0 */
public class Strategy {
public static void main(String[] args) {
OperationMachine operationMachine = new OperationMachine();
int a = 3, b = 79;
operationMachine.setOperation(new Add());
System.out.println(operationMachine.executeStrategy(a, b));
operationMachine.setOperation(new Divide());
System.out.println(operationMachine.executeStrategy(b,a));
}
}
3. 源码实现
3.1 Java集合排序
最常见的策略模式就是在JAVA集合类中,通过实现Comparator来指定排序规则。
public interface Comparator<T> {
int compare(T o1, T o2);
}
PriorityQueue<Integer> integers = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
这里的 Comparator 接口就是使用了策略模式,实际使用中 implements Comparator
接口或者使用接口的匿名实现类,根据需求实现不同比较逻辑的算法策略。当然这里并没有内置不同策略的实现,而是放开给程序员自己实现。
3.2 Resource
策略模式:例如Resource的实现类,针对不同的资源文件,实现了不同方式的资源获取策略