描述
- 实现最终目的,有很多种算法方法。为了实现切换算法而不影响使用算法的客户端,引入的策略模式
- 比如:从北京到上海有很多种实现方式。抽象化去的方法,具体是坐飞机去,还是坐地铁去,不影响我最终可以到达的这个目的。
角色
- 抽象策略类:定义策略类的功能,使用规则。可以是接口,也可以是抽象类。
- 具体策略类:实现抽象策略类的具体类。
- 环境类:使用策略类的客户端。
实现
public class Test {
public static void main(String[] args) {
Beijing beijing = new Beijing(new MotorCarStrategy());
beijing.goTO();
// 不够快,换一种策略
beijing.setStrategy(new RocketStrategy());
beijing.goTO();
}
}
// 策略 抽象策略类
interface Strategy{
// 行动方式
String act();
}
// 具体实现类
class MotorCarStrategy implements Strategy {
@Override
public String act() {
return "坐火车";
}
}
// 具体实现类
class RocketStrategy implements Strategy {
@Override
public String act() {
return "坐火箭";
}
}
// 客户端使用 环境类
class Beijing {
private Strategy strategy;
Beijing(Strategy strategy) {
this.strategy = strategy;
}
public void goTO() {
System.out.println("去北京要:" + strategy.act());
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
优点
- 可以自由切换具体策略类。
- 易扩展,增加一个策略类,不用更改客户端代码。
- 面向对象的设计思想,避免多次使用 if else。
缺点
- 客户端要自行决定策略,要了解这个策略。
- 策略模式容易产生多个策略类。
使用场景
- 需要动态的来回切换算法实现时,可以使用策略模式。
- 一个类有多种行为,且每个行为都多次条件判断语句的形式出现,可以使用策略模式,把多种行为提取到各自的策略类中。
- 不需要为客户提供具体实现细节时,可以提取抽象策略类,隐藏具体细节。
JDK源码中的实现
- Comparator接口 compare()方法
抽象策略类:
具体策略类(子类):
客户端使用(环境类):