背景介绍
针对秒杀活动,产品MM提出用户预约活动之后对其推送消息通知的功能,之前同事已经接过一次A小程序的推送通知,现在需要再接入B小程序的微信推送通知,除了部分参数不一样,其他参数都没有任何变动,存在很多重复性代码,因此将重复的代码,将其共性提出来,作为一套共用的模板,另外,现在只涉及到接入两个小程序的微信推送功能,假如还需要接其他小程序的微信推送通知,这个时候,就可以用策略模式来进行优化,每一个小程序接入就是一种策略方式。
创建一个策略接口
public interface PushMessageStrategy extends InitializingBean {
WechatAppletPushMessageRequest buildSeckillSubscribeMessage(SeckillSubscribeDTO seckillSubscribeDTO, int memberSubscribeSize);
WechatAppletPushMessageRequest buildSeckillActivityNoticeMessage(SeckillSubscribeDTO seckillSubscribeDTO, Long caseId, Long sectionId);
}
创建策略抽象类
@Slf4j
public abstract class AbstractPushMessageStrategy implements PushMessageStrategy {
public abstract void setSceneCode(MessageTemplateRequest request);
public abstract void setPlateId(WechatAppletPushMessageRequest request);
public abstract String getPushUrl(Long caseId, Long sectionId, Long sectionCategoryId, String channel, Long spuId);
public abstract String getPushAdvanceUrl(Long caseId, Long sectionId, String channel);
@Override
public WechatAppletPushMessageRequest buildSeckillSubscribeMessage(SeckillSubscribeDTO seckillSubscribeDTO, int memberSubscribeSize) {
WechatAppletPushMessageRequest request = new WechatAppletPushMessageRequest();
request.setBusinessCode(ConfigureCenterHelper.getSubscribeBusinessCode());
request.setProjectId(ConfigureCenterHelper.getProjectId());
// 设置渠道id
setPlateId(request);
request.setMemberId(seckillSubscribeDTO.getMemberId());
request.setOpenId(seckillSubscribeDTO.getOpenId());
request.setUnionId(seckillSubscribeDTO.getUnionId());
Map<String, String> templateMap = new HashMap<>();
templateMap.put("activityName", ConfigureCenterHelper.getActivityName());
templateMap.put("startTime", DateUtil.date2String(seckillSubscribeDTO.getKillStartTime(), "yyyy年MM月dd日 HH:mm:ss"));
String spuName = seckillSubscribeDTO.getSpuName().length() > 8 ? seckillSubscribeDTO.getSpuName().substring(0, 7) + "..." : seckillSubscribeDTO.getSpuName();
StringBuilder remarkStr = new StringBuilder();
if (memberSubscribeSize > 1) {
remarkStr.append("您预约的").append(spuName).append("+等秒杀即将开始了");
templateMap.put("remark", remarkStr.toString());
} else {
remarkStr.append("您预约的").append(spuName).append("秒杀即将开始了");
templateMap.put("remark", remarkStr.toString());
}
// 获取推送连接
String pushUrl = getPushUrl(seckillSubscribeDTO.getCaseId(), seckillSubscribeDTO.getSectionId(), seckillSubscribeDTO.getSectionCategoryId(),
seckillSubscribeDTO.getChannel(), seckillSubscribeDTO.getSpuId());
templateMap.put("pushUrl", pushUrl);
request.setTemplateMap(templateMap);
return request;
}
@Override
public WechatAppletPushMessageRequest buildSeckillActivityNoticeMessage(SeckillSubscribeDTO seckillSubscribeDTO, Long caseId, Long sectionId) {
WechatAppletPushMessageRequest request = new WechatAppletPushMessageRequest();
request.setBusinessCode(ConfigureCenterHelper.getSeckillAdvanceBusinessCode());
request.setProjectId(ConfigureCenterHelper.getProjectId());
// 设置渠道id
setPlateId(request);
request.setMemberId(seckillSubscribeDTO.getMemberId());
request.setOpenId(seckillSubscribeDTO.getOpenId());
request.setUnionId(seckillSubscribeDTO.getUnionId());
Map<String, String> templateMap = new HashMap<>();
templateMap.put("activityName", ConfigureCenterHelper.getActivityName());
templateMap.put("activityStatus", ConfigureCenterHelper.getActivityStatus());
templateMap.put("remark", "您订阅的秒杀即将开始。");
// 获取推送连接
String pushAdvanceUrl = getPushAdvanceUrl(caseId, sectionId, seckillSubscribeDTO.getChannel());
templateMap.put("pushUrl", pushAdvanceUrl);
request.setTemplateMap(templateMap);
return request;
}
}
A小程序推送策略
public class PushMessageStrategyA extends AbstractPushMessageStrategy {
private static final String A_CHANNEL = "A_CHANNEL";
@Override
public void setSceneCode(MessageTemplateRequest request) {
request.setSceneCode(ConfigureCenterHelper.getSceneCodeA());
}
@Override
public void setPlateId(WechatAppletPushMessageRequest request) {
request.setPlateId(ConfigureCenterHelper.getPlateIdA());
}
@Override
public String getPushUrl(Long caseId, Long sectionId, Long categoryId, String channel, Long spuId) {
String encodrUrl = null;
try {
encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "§ionId=" + sectionId + "&categoryId=" + categoryId + "&spuId=" + spuId, "utf-8");
} catch (UnsupportedEncodingException e) {
log.info("推送链接encode异常");
}
return ConfigureCenterHelper.getPushMiniUrl() + encodrUrl;
}
@Override
public String getPushAdvanceUrl(Long caseId, Long sectionId, String channel) {
String encodrUrl = null;
try {
encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "§ionId=" + sectionId, "utf-8");
} catch (UnsupportedEncodingException e) {
log.info("推送链接encode异常");
}
return ConfigureCenterHelper.getPushMiniUrl() + encodrUrl;
}
@Override
public void afterPropertiesSet() throws Exception {
PushMessageFactory.register(A_CHANNEL, this);
}
}
B小程序推送策略
public class PushMessageStrategyB extends AbstractPushMessageStrategy {
private static final String B_CHANNEL = "B_CHANNEL";
@Override
public void setSceneCode(MessageTemplateRequest request) {
request.setSceneCode(ConfigureCenterHelper.getSceneCodeB());
}
@Override
public void setPlateId(WechatAppletPushMessageRequest request) {
request.setPlateId(ConfigureCenterHelper.getPlateIdB());
}
@Override
public String getPushUrl(Long caseId, Long sectionId, Long categoryId, String channel, Long spuId) {
String encodrUrl = null;
try {
encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "§ionId=" + sectionId + "&categoryId=" + categoryId + "&spuId=" + spuId + "&entrance=dymes", "utf-8");
} catch (UnsupportedEncodingException e) {
log.info("推送链接encode异常");
}
return ConfigureCenterHelper.getPushMiniUrlB() + encodrUrl;
}
@Override
public String getPushAdvanceUrl(Long caseId, Long sectionId, String channel) {
String encodrUrl = null;
try {
encodrUrl = URLEncoder.encode(ConfigureCenterHelper.getPushBaseUrl() + caseId + "?channel=" + channel + "§ionId=" + sectionId + "&entrance=dymes", "utf-8");
} catch (UnsupportedEncodingException e) {
log.info("推送链接encode异常");
}
return ConfigureCenterHelper.getPushMiniUrlB() + encodrUrl;
}
@Override
public void afterPropertiesSet() throws Exception {
PushMessageFactory.register(B_CHANNEL, this);
}
}
推送策略工厂类
public class PushMessageFactory {
private PushMessageFactory(){}
private static final Map<String, PushMessageStrategy> PUSH_MESSAGE_STRATEGY_MAP = Maps.newConcurrentMap();
public static PushMessageStrategy createStrategy(String channel) {
return PUSH_MESSAGE_STRATEGY_MAP.get(channel);
}
/**
* 注册策略
*
* @param channel 渠道
* @param pushMessageStrategy 推松消息策略
*/
public static void register(String channel, PushMessageStrategy pushMessageStrategy) {
PUSH_MESSAGE_STRATEGY_MAP.put(channel, pushMessageStrategy);
}
}
后续如果需要再接入别的小程序,只需要继承抽象类,设置它自己需要的参数即可。