1.基本介绍
(1) 策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
(2) 这算法体现了几个设计原则,第一、把变化的代码从不变的代码中分离出来;第二、针对接口编程而不是具体类(定义了策略接口);第三、多用组合/聚合,少用继承(客户通过组合方式使用策略)。
2.策略模式的通用代码
public class Context {
private Strategy strategy = null;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void doAnything(){
this.strategy.doSomething();
}
}
public interface Strategy {
public void doSomething();
}
public class ConcreteStrategy1 implements Strategy{
@Override
public void doSomething() {
System.out.println("ConcreteStrategy1");
}
}
public class ConcreteStrategy2 implements Strategy{
@Override
public void doSomething() {
System.out.println("ConcreteStrategy2");
}
}
public class StrategyClient {
public static void main(String[] args) {
Strategy strategy = new ConcreteStrategy1();
Context context = new Context(strategy);
context.doAnything();
}
}
3.策略模式在Arrays.sort中的应用
public class Main {
public static void main(String[] args) {
Integer[] arr = new Integer[]{21, 3, 4, 32, 5435, 25, 654654, 0};
Comparator<Integer> comparator = new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
if (o1 > o2) {
return -1;
} else {
return 1;
}
}
};
Arrays.sort(arr,comparator);
Arrays.sort(arr, (n1, n2) -> {
return n1 - n2;
});
System.out.println(Arrays.toString(arr));
}
}
4.策略模式的注意事项和细节
(1) 策略模式的关键是:分析项目中变化部分与不变部分
(2) 策略模式的核心思想是:多用组合/聚合 少用继承;用行为类组合,而不是行为的继承。更有弹性
(3) 体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为) 即可,避免了使用多重转移语句(if..else if..else)
(4) 提供了可以替换继承关系的办法:策略模式将算法封装在独立的 Strategy 类中使得你可以独立于其 Context 改变它,使它易于切换、易于理解、易于扩展
(5) 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞大,所以大多数情况下都是用户自定义策略