【第三天】策略模式
前言
策略模式是针对不同算法给出不同实现的方式,解耦代码,减少代码中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 {@Overidepublic double countResult(int a, int b) {return a + b;}}public class CallulatorSubtract implement CallulatorStrategy {@Overidepublic double countResult(int a, int b) {return a - b;}}public class CallulatorMultiplication implement CallulatorStrategy {@Overidepublic double countResult(int a, int b) {return a * b;}}public class CallulatorDivision implement CallulatorStrategy {@Overidepublic 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、同一个对象不同的算法实现