需求:根据已知的发送方式确定策略
实现:
首先是策略接口
public interface WxTemplateStrategy {
//处理类型
boolean processWxTemlate(Long taskId);
//if else 条件
String getType() ;
}
其次是每种策略的实现
1.不发送
@Slf4j
@Component
public class NotSendWxTemplateStrategy implements WxTemplateStrategy {
@Override
public boolean processWxTemlate(Long taskId) {
log.info("暂不发送");
//todo 业务逻辑
return true;
}
@Override
public String getType() {
return "NOT_SEND";
}
}
2.立即发送
@Component
@Slf4j
public class SendNowWxTemplateStrategy implements WxTemplateStrategy {
@Override
public boolean processWxTemlate(Long taskId) {
//todo 业务逻辑
log.info("立即发送,taskId:"+taskId);
return true ;
}
@Override
public String getType() {
return "SEND_NOW";
}
}
3.预约发送
@Slf4j
@Component
public class SendAppWxTemplateStrategy implements WxTemplateStrategy {
@Override
public boolean processWxTemlate(Long taskId) {
log.info("预约发送,taskId:"+taskId);
//todo
return true;
}
@Override
public String getType() {
return "SEND_APP";
}
}
工厂模式初始化
@Service
public class StrategyFactory {
private final List<WxTemplateStrategy> strategy;
public StrategyFactory (List<WxTemplateStrategy> strategy) {
this.strategy = strategy;
}
private Map<String,WxTemplateStrategy> strategies = new ConcurrentHashMap<>();
/**
* 提前注入
*/
@PostConstruct
public void initStrategy() {
Optional.ofNullable(strategy).orElseGet(ArrayList::new)
.forEach(tracer -> {
strategies.put(tracer.getType(), tracer);
});
}
/**
* 上下文对象暴露给服务调用端接口,封装实现方式
* @param
*/
public void useStrategies(String type, Long taskId){
strategies.get(type).processWxTemlate(taskId);
}
}
运行中代码调用
//提前注入
@Resource
private StrategyFactory factory;
//todo 方法中使用
factory.useStrategies(type,id);