1.白话文定义
针对不同场景的算法,将每个算法都封装到具有共同接口的独立类中。策略模式可以使得算法在不影响客户端的情况下自己选择对应策略。 前提客户端必须提前知道总共有多少种策略。
2.角色
1.Context上下文环境类:负责持有IStrategy的引用;
2.抽象策略类:通常是一个接口或抽象类,负责定义策略执行的方法;
3.策略实现类:具体的策略实现类,负责执行具体的方法;
4.客户端调用类。
3.类图
4.代码实现
- 策略接口
public interface IStrategy {
/**
* @desc 策略方法
*/
void doOperator();
}
- 策略实现类A
public class StrategyAImpl implements IStrategy{
@Override
public void doOperator() {
System.out.println("strategyA doOperator");
}
}
- 策略实现类B
public class StrategyBImpl implements IStrategy {
@Override
public void doOperator() {
System.out.println("strategyB doOperator");
}
}
- 环境上下类
ublic class Context {
private IStrategy iStrategy;
public Context(IStrategy iStrategy) {
this.iStrategy = iStrategy;
}
public void doOperator() {
iStrategy.doOperator();
}
}
- 客户调用类
public class Main {
public static void main(String[] args) {
Context context = new Context(new StrategyAImpl());
context.doOperator();
}
}
- 测试结果
5.优点
可以避免使用多重(if-else)条件语句。
6.缺点
1.客户端必须知道所有的策略情况,并自行决定使用哪种策略;
2.由于每个策略类都被封装成独立类,如果备选的策略很多,容易造成类爆炸。