1 场景导入
先不扯虚的,先看策略模式常用的应用可以消除一堆恶心的if else
以加减乘除为例:
1.1 不用策略模式
before不用策略模式
public class Main {
public static void main(String[] args) {
String operator = "+";
int a = 10;
int b = 5;
int result = 0;
if ("+".equals(operator)) {
result = add(a,b);
} else if ("-".equals(operator)) {
result = sub(a,b);
} else if ("*".equals(operator)) {
result = mul(a,b);
} else {
result = div(a,b);
}
System.out.println("结果是:" + result);
}
static int add(int a, int b) {
return a + b;
}
static int sub(int a, int b) {
return a - b;
}
static int mul(int a, int b) {
return a * b;
}
static int div(int a, int b) {
if (b == 0) throw new RuntimeException("除数不能为0");
return a / b;
}
}
输出结果
中间一堆if else看着不舒服而且会随着运算符的变多,变得越来越长
1.2 after用了策略模式
package per.blacksnow.strategy.example.ifelse.my.after;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
// 测试类
public class Main {
public static void main(String[] args) {
OperatorStrategy strategy = new AddStrategy();
int a = 10;
int b = 5;
int result = 0;
Context context = new Context();
context.setStrategy(strategy);
result = context.operate(10, 5);
System.out.println("结果是:" + result);
}
}
// 抽象策略(Strategy)类
interface OperatorStrategy {
int operate(int a, int b);
}
// 具体策略(Concrete Strategy)类
class AddStrategy implements OperatorStrategy{
@Override
public int operate(int a, int b) {
return a + b;
}
}
// 具体策略(Concrete Strategy)类
class SubtractStrategy implements OperatorStrategy{
@Override
public int operate(int a, int b) {
return a - b;
}
}
// 环境(Context)类
@Data
@NoArgsConstructor
@AllArgsConstructor
class Context {
OperatorStrategy strategy;
public int operate(int a, int b) {
return strategy.operate(a, b);
}
}
if else不见了,而且扩展性也好,只要添加各种Strategy,然后设置想要的策略即可
2 UML图
3 模式的角色
3.1 抽象策略类
定义一个上层接口,所有不同的策略都要对这个接口中定义的方法进行各自的算法实现,比如都要进行对operate方法进行实现
3.2 具体策略类
实现具体的算法,比如AddStrategy实现加法,SubtructStrategy实现减法等
3.3 环境类
持有策略类的引用,通过这个引用来给客户端进行调用
4 应用场景
- 系统中各算法彼此独立,需要在运行时动态地在几种算法中选择一种
- 消除if-else
- 需要对客户端隐藏具体的算法细节,客户端只要知道有什么算法就行