1.定义策略接口
package com.essence.handler.apphandler;
import com.essence.beans.param.AppMessageParam;
import com.essence.beans.param.SnosParam;
import org.springframework.beans.factory.InitializingBean;
import java.util.Map;
public interface AppHandler extends InitializingBean {
Map<String, String> appMessagePush(AppMessageParam param);
public boolean support(SnosParam snos);
public int getOrder();
}
2.具体的策略类实现
/**
* 资讯产品策略类
*/
@Component
@Slf4j
public class AHandler implements AppHandler {
@Value("${TZXURL_PREFIX}")
private String TZXURL_PREFIX;
@Value("${appArticleProIds}")
private List<String> appArticleProIds;
@Override
public Map<String, String> appMessagePush(AppMessageParam param) {
return resultMap;
}
@Override
public boolean support(SnosParam snos) {
return appArticleProIds.contains(snos.getProId()) || "资讯文章".equals(snos.getInfoName());
}
@Override
public void afterPropertiesSet() throws Exception {
AppFactory.register(this);
}
@Override
public int getOrder() {
return 1;
}
}
3.策略工厂类
public class AppFactory {
//private static Map<Snos, AHandler> strategyMap = new HashMap<>();
private static List<AppHandler> strategyList = new ArrayList<>();
public static AppHandler getInvokeStrategy(SnosParam snos) {
strategyList=strategyList.stream().sorted(Comparator.comparing(AppHandler::getOrder)).collect(Collectors.toList());
for (AppHandler appHandler : strategyList) {
//条件满足
boolean support = appHandler.support(snos);
if (support) {
return appHandler;
}
}
return null;
}
public static void register(AppHandler handler) {
strategyList.add(handler);
}
}
4.调用
// 根据条件获得策略
AppHandler appHandler = AppFactory.getInvokeStrategy(SnosParam.builder()
.proId(infoParam.getProId())
.infoName(infoParam.getInfoName())
.infoCont(infoParam.getInfoCont())
.infoLink(infoParam.getInfoLink())
.relStock(infoParam.getRelStock())
.goodsId(infoParam.getGoodsId())
.msgType(infoParam.getMsgType())
.mainId(infoParam.getMainId())
.build());
//调用具体的策略类获取参数
Map<String, String> resultMap = appHandler.appMessagePush(AppMessageParam.builder()
.content(infoParam.getContent())
.title(infoParam.getTitle())
.infoCont(infoParam.getInfoCont())
.proId(infoParam.getProId())
.execMsg(infoParam.getExecMsg())
.proSname(bindCustInfoParamList.get(0).getProsName())
.mainId(infoParam.getMainId())
.infoName(infoParam.getInfoName())
.infoLink(infoParam.getInfoLink())
.build());