前言
策略模式是针对不同算法给出不同实现的方式,解耦代码,减少代码中if.....else代码书写量。
一、策略模式UNL类图
对象 | 角色 |
Context | 上下文对象,依赖Strategy接口,一般像Context传入Strategy实现对象,执行策略方法 |
Strategy | 为不同实现类定义要执行策略的方法的接口 |
StrategyImpl | 具体算法逻辑实现类,主要是实现不同的算法实现 |
二、代码案例
以计算器的案例为例,一个计算器要对两个数字进行加减乘除得算法,最终都会得到一个结果。我们把执行加减乘除看做是不同的策略。
1、抽象出计算器加减乘除策略接口
public interface CallulatorStrategy {
public double countResult(int a, int b);
}
2、定义加减乘除类的四个实现,继承CalclulatorStrategy接口
public class CallulatorAdd implement CallulatorStrategy {
@Overide
public double countResult(int a, int b) {
return a + b;
}
}
public class CallulatorSubtract implement CallulatorStrategy {
@Overide
public double countResult(int a, int b) {
return a - b;
}
}
public class CallulatorMultiplication implement CallulatorStrategy {
@Overide
public double countResult(int a, int b) {
return a * b;
}
}
public class CallulatorDivision implement CallulatorStrategy {
@Overide
public double countResult(int a, int b) {
return a / b;
}
}
3、定义一个策略类,用来执行策略类
public class StrategyContext {
private CallulatorStrategy strategy;
public StrategyContext (CallulatorStrategy strategy) {
this.strategy = strategy;
}
public double strategyExecute (double a, double b) {
this.strategy.countResult(a, b);
}
}
4、调用示例
public class Demo {
public static void main(String[] args) {
StrategyContext context = new StrategyContext (new CallulatorAdd());
System.out.println(context.strategyExecute(10, 5));
context = new Context(new CallulatorSubtract());
System.out.println(context.strategyExecute(10, 5));
context = new Context(new CallulatorMultiply());
System.out.println(context.strategyExecute(10, 5));
}
}
三、总结
优点
1、减少了代码中的逻辑判断
2、算法可自由切换、实际开发算法实现类可配置在配置文件、数据库中
3、扩展性好
缺点
1、 策略类会随着业务扩展越来越多
2、策略类均要对外暴露
使用场景
1、减少判断语句
2、同一个对象不同的算法实现