策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
实战用途 ,解决多个if-else
导致代码冗余
- 业务处理主服务类
@Service
public class StrategyMode {
/**
* 业务逻辑分派Map
* Function为函数式接口,下面代码中 Function<String, String> 的含义是接收一个Stirng类型的变量,返回一个String类型的结果
* 单条件
*/
private Map<String,Function<String,String>> checkResultDispatcher = new HashMap<>();
@Autowired
private IDerive derive;
/**
* 初始化 业务逻辑分派的 Map
* 其中value存放的是 lamada表达式
*/
@PostConstruct
public void setCheckResultDispatcherInit (){
/*checkResultDispatcher.put("分流1", order -> String.format("对%s执行对应的业务逻辑1" , order));
checkResultDispatcher.put("分流2", order -> String.format("对%s执行对应的业务逻辑2" , order));
checkResultDispatcher.put("分流3", order -> String.format("对%s执行对应的业务逻辑3" , order));
checkResultDispatcher.put("分流4", order -> String.format("对%s执行对应的业务逻辑4" , order));
checkResultDispatcher.put("分流5", order -> String.format("对%s执行对应的业务逻辑5" , order));
checkResultDispatcher.put("分流6", order -> String.format("对%s执行对应的业务逻辑6" , order));*/
checkResultDispatcher.put("业务1" , order -> derive.part1(order));
checkResultDispatcher.put("业务2" , order -> derive.part2(order));
checkResultDispatcher.put("业务3" , order -> derive.part3(order));
checkResultDispatcher.put("业务4" , order -> derive.part4(order));
}
public String getCheckResultSuper(String order){
Function<String,String> result = checkResultDispatcher.get(order);
if(result != null){
return result.apply(order);
}
return "不在处理的业务范围你之内";
}
}
- 派生处理业务(可以写接口)
/**
* @ClassName IDerive
* @Description 派生处理的业务逻辑
* @Author xiongchao
* @Date 2020/6/24 14:51
**/
public interface IDerive {
String part1 (String order);
String part2 (String order);
String part3 (String order);
String part4 (String order);
String part5 (String order);
}
- 实现类,进行对应的业务逻辑处理
@Service
public class DeriveImpl implements IDerive {
@Override
public String part1(String order) {
return order + "业务1";
}
@Override
public String part2(String order) {
return order + "业务2";
}
@Override
public String part3(String order) {
return order + "业务3";
}
@Override
public String part4(String order) {
return order + "业务4";
}
@Override
public String part5(String order) {
return order + "业务5";
}
}
方法二 (多任务处理最佳)
- 公共接口定义
/**
* @ClassName IntefaceHome
* @Description 接口定义 根据匹配的类名 去调用对应的 逻辑代码处理 策略模式
* @Author xiongchao
* @Date 2020/6/24 15:24
**/
public interface IntefaceHome {
ConcurrentHashMap<String,IntefaceHome> models = new ConcurrentHashMap<>();
String exucet(Object obj);
}
- 方法的调用
/**
* @ClassName Mulitipart
* @Description TODO
* @Author xiongchao
* @Date 2020/6/24 15:28
**/
public class Mulitipart implements IntefaceHome {
@PostConstruct
public void init (){
models.put(this.getClass().getSimpleName(),this);
}
@Override
public String exucet(Object obj) {
//这里直接通过类名匹配,调用指定的类
//这里进行对应的逻辑length处理 ,调用的时候 根据key去匹配 调用对应的逻辑类
IntefaceHome home = IntefaceHome.models.get(obj.getTask());
home.exucet(obj);
return null;
}
}