策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化
策略模式包含如下角色:
Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorithm())
Context: 环境类 /上下文类:
上下文是依赖于接口的类(是面向策略设计的类,如下图Context类),即上下文包含用策略(接口)声明的变量(如下图的strategy成员变量)。
上下文提供一个方法(如下图Context类中的的lookAlgorithm()方法),持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类(如下图的ConcreteStrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)
1、 代码中存在大量 if else 逻辑判断
2、业务代码需要根据场景不同,切换不同的实现逻辑
抽象类策略
public interface AddStrategy {
/**
* 策略开始之前... 可以做一些校验工作
*
*/
void strategyBefore();
/**
* 策略方法...执行具体业务
*
*/
void strategyProcess(参数1);
/**
* 策略之后....可做一些业务处理后操作
*
* @param id
*/
void strategyAfter();
/**
* 执行策略
*
*/
void strategy(参数1){
strategyBefore();
strategyProcess(参数1);
strategyAfter();};
/**
* 获取每个策略实现的标识
* @return
*/
Integer getStrategyName();
}
具体实现1
public class AddBankStrategy implements AddStrategy, CommonConstant {
@Override
public void strategyBefore() {
}
@Override
public void strategyProcess(参数1) {
//具体实现逻辑
}
@Override
public void strategyAfter() {
}
@Override
public Integer getStrategyName() {
return 1;
}
}
具体实现2
public class AddGXStrategy implements AddStrategy, CommonConstant {
@Override
public void strategyBefore() {
}
@Override
public void strategyProcess(参数1) {
//具体实现逻辑
}
@Override
public void strategyAfter() {
}
@Override
public Integer getStrategyName() {
return 2;
}
}
注入context
private final Map<Integer, AddStrategy> strategyContext = new HashMap<>();
public AddService(List<AddStrategy> strategyList) {
for (AddStrategy strategy : strategyList) {
strategyContext.put(strategy.getStrategyName(), strategy);
}
}
在业务中获取不同策略
int = 1;//可作为变量 这样就能动态获取策略
strategyContext.get(code).strategy(参数1);