模式定义
定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换 & 让算法可在不影响客户端的情况下发生变化
简单来说:准备一组算法 & 将每一个算法封装起来,让外部按需调用 & 使得互换
作用(解决的问题)
将算法的责任和本身进行解耦,使得:
1、算法可独立于使用外部而变化
2、客户端方便根据外部条件选择不同策略来解决不同问题
策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定
UML类图
角色解析
Strategy :抽象方案
StrategyA 、StrategyB:具体方案
Context :方案执行者
实例讲解
使用场景:任何可以替换方案的场景,比如 做公交收费、商场促销活动方案、等等...
public abstract class Strategy {
public abstract void operate();
}
public class StrategyA extends Strategy{
@Override
public void operate() {
System.out.println("StrategyA - 算法");
}
}
public class StrategyB extends Strategy{
@Override
public void operate() {
System.out.println("StrategyB - 算法");
}
}
public class Context {
// 持有抽象策略角色的引用
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void operate() {
strategy.operate();
}
}
public class Client {
public static void main(String[] args) {
Context cxt = new Context();
//A方案
cxt.setStrategy(new StrategyA());
cxt.operate();
//B方案
cxt.setStrategy(new StrategyB());
cxt.operate();
}
}
优缺点
在全面解析完后,我来分析下其优缺点:
优点
策略类之间可以自由切换
由于策略类都实现同一个接口,所以使它们之间可以自由切换。易于扩展
增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
避免使用多重条件选择语句(if else),充分体现面向对象设计思想。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。