类图
定义
定义一组算法,将每个算法封装起来,并且使它们之间可以互换
优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好缺点
- 策略类数量增多 每个策略一个类,复用的可能性很小,类数量增多
- 所有的策略多需要对外暴露
使用场景
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
注意事项
如果一个系统中策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题
抽象策略角色
public interface Strategy {
/**
* 策略模式的运算准则
*/
void doSomething();
}
具体策略1
public class ConcreteStrategy1 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略1的运算法则");
}
}
具体策略2
public class ConcreteStrategy2 implements Strategy {
@Override
public void doSomething() {
System.out.println("具体策略2的运算法则");
}
}
上下文对象
public class Context {
/**
* 策略
*/
private Strategy strategy = null;
/**
* 设置具体策略
*
* @param strategy 策略
*/
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
/**
* 封装后的策略方法
*/
public void doSomething() {
this.strategy.doSomething();
}
}
场景类
public class Client {
public static void main(String[] args) {
// 声明具体的策略
Strategy strategy1 = new ConcreteStrategy1();
Strategy strategy2 = new ConcreteStrategy2();
// 声明上下文对象
Context context = new Context();
// 设置策略
context.setStrategy(strategy1);
context.doSomething();
// 切换策略
context.setStrategy(strategy2);
context.doSomething();
}
}
运行结果
具体策略1的运算法则
具体策略2的运算法则