策略模式
策略模式
策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。现有一个开发要求:根据不同的条件来进行不同的计算选择。如:条件condition="add",则进行相加操作,condition="sub",则进行相减操作,condition="mul",则进行相乘操作如,此则可以选择使用策略模式来实现此功能。
1、策略模式结构图
2、伪代码实现
- 定义一个策略接口,此接口为共同的一个操作,无论是相加还是相减还是其他,均调用的是此接口来进行处理
//接口
interface Strategy {
int calculate(int a, int b);
}
- 创建具体的计算实现类,必须要实现Strategy接口
/**相加的具体实现类*/
public class AddCalculate implements Strategy {
public int calculate(int a, int b) {
//TODO 具体的业务代码,如参数校验
return a + b;
}
}
/**相减的具体实现类*/
class SubCalculate implements Strategy {
public int calculate(int a, int b) {
//TODO 具体的业务代码,如参数校验
return a - b;
}
}
/**相乘的具体实现类*/
class MulCalculate implements Strategy {
public int calculate(int a, int b) {
//TODO 具体的业务代码,如参数校验
return a * b;
}
}
- 好了,现在相关的不同情况下的计算逻辑都已经实现了。我们还需要一个类来统一的进行管理,提供给调用方。
/**管理类*/
public class ManageStrategy {
//声名最先定义的接口
private Strategy strategy;
//此方法由调用方根据具体的条件来传入相对应的Strategy接口实现,返回此管理对象
ManageStrategy setStrategy(Strategy strategy) {
this.strategy = strategy;
return this;
}
//具体的实现
int executeStrategy(int a, int b) {
return strategy.calculate(a, b);
}
}
- 现在,我们看看如何使用
public class Client {
int client(String condition, int a, int b) {
ManageStrategy manageStrategy = new ManageStrategy();
//根据不同的条件来获取不同的策略
if("add".equest(condition)) {
manageStrategy = manageStrategy.setStrategy(new AddCalculate());
}
if("sub".equest(condition)) {
manageStrategy = manageStrategy.setStrategy(new SubCalculate());
}
if("mul".equest(condition)) {
manageStrategy = manageStrategy.setStrategy(new MulCalculate());
}
return manageStrategy.executeStrategy(a, b);
}
}
- 上面的调用是不是还是有点复杂,下面看看如何优化管理类
/**我们可以在管理类里面统一的进行全面的管理,不管调用方需要什么,都在管理类里面进行选择*/
public class ManageStrategy {
//我们可以声明一个Map来保存策略的实现类,key就是condition条件,value就是Strategy接口
private static final Map<String, Strategy> map = new HashMap<>(8);
static {
map.put("add", new AddCalculate());
map.put("sub", new SubCalculate());
map.put("mul", new MulCalculate());
}
//提供给调用方进行调用的方法
final public int executeStrategy(String condition, int a, int b) {
Strategy strategy= map.get(condition);
return strategy.calculate(a, b);
}
}
- 调用优化后的管理类,此后如果再增加其他方法比如相除的,那么在此业务代码client方法体中,我们就不用再次的改动这个代码了。我们只要增加一个Strtegy的实现类,实现相除的方法逻辑,然后再在管理类ManageStrategy中的静态方法map中增加对应的元素,就可以实现了。
public class Client {
int client(String condition, int a, int b) {
ManageStrategy manageStrtegy = new ManageStrategy();
manageStrtegy.executeStrategy(condition, a, b);
}
}