
📝个人主页:五敷有你
🔥系列专栏:设计模式
⛺️稳中求进,晒太阳

概念
1、策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。
定义如下:
Define a family of algorithms,encapsulate each one,and make them interchangeable. (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)
- 如果有大量的判断,if else 可以通过策略模式进行替换,如下:
java
int a=1;int b=0;
if(a>b){
int c=a+b;
System.out.println(c);
}if(a<b){
int c=a-b;
System.out.println(c);
}else {
int c=a*b;
System.out.println(c);
}
太多的if else导致代码十分冗余,这还是每个语句块只有两行代码,如果有几百行其不得累死。
- 避免使用多重条件转换语句
- 提高算法的保密性和安全性
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法
何时使用:
一个系统有许多许多类,而区分它们的只是他们直接的行为
具体实现:
- 定义一个接口行为 StrategyDemo
java
public interface StrategyDemo {
public int operation(int num1,int num2);
}
2 . 不同策略行为的实现不同
各种策略的对象(加法策略、减法策略。。。)
加法行为:
java
package strategy;
public class AddStrategy implements StrategyDemo {
@Override
public int operation(int num1, int num2) {
return num1+num2;
}
}
减法行为:
java
package strategy;
public class SubStrategy implements StrategyDemo{
@Override
public int operation(int num1, int num2) {
return num1-num2;
}
}
3 . 之后定义一个类,定义一个策略的接口,之后要使用哪种策略,直接替换接口的实现类即可。
java
package strategy;
public class Operation {
private StrategyDemo strategyDemo;
public Operation(StrategyDemo strategyDemo) {
this.strategyDemo = strategyDemo;
}
public int execute(int num1,int num2){
return strategyDemo.operation(num1,num2);
}
}
4 . 测试
java
package strategy;
public class Test {
public static void main(String[] args) {
//加法
Operation operation=new Operation(new AddStrategy());
int execute = operation.execute(1, 2);
System.out.println("1+2 = "+execute);
//减法
Operation operation1=new Operation(new SubStrategy());
int execute1 = operation1.execute(1, 2);
System.out.println("1-2 = "+execute1);
}
}
5 . 运行结果

总结
策略模式定义了一系列算法,从概念上来说,所有的这些算法都是做相同的事情,只是实现不同,他可以以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合。
从另外一个层面上来说,单独定义算法类,也方便了单元测试,因为可以通过自己的算法进行单独测试。
实践中,不仅可以封装算法,也可以用来封装几乎任何类型的规则,是要在分析过程中需要在不同时间应用不同的业务规则,就可以考虑是要策略模式来处理各种变化。