本文以小程序订阅消息推送为例,由于各种消息模板不一样,及不同的消息推送的人群也不一样,所以每种消息要进行不同的封装及处理,为避免过多的 if else 的逻辑及代码冗余,所以选择使用策略模式使之层次分明,功能独立。
一、编写策略模式相关代码及处理前端请求代码
1.新建文件 WeChatMessageStrategy
/*
* 所有策略调用的公共接口
* */
public interface WeChatMessageStrategy {
JSONObject sendMessage(Map params) throws Exception;
}
2.新建文件 WeChatMessageContext
/**
*构造策略环境,内部持有一个策略类的引用,给客户端调用
*/
public class WeChatMessageContext {
private WeChatMessageStrategy weChatMessageStrategy;
// 有参构造方法
public WeChatMessageContext(WeChatMessageStrategy weChatMessageStrategy){
this.weChatMessageStrategy = weChatMessageStrategy;
}
// 调用具体的实现策略
public JSONObject sendMessage(Map params) throws Exception{
return weChatMessageStrategy.sendMessage(params);
}
}
3.新建文件 WeChatMessageStrategyFactory
/**
*新建策略工厂,根据不同的消息模板返回不同的策略
*/
@Service
public class WeChatMessageStrategyFactory {
// strategyMaps:包含所有的策略实现类
@Autowired
private Map<String, WeChatMessageStrategy> strategyMaps;
public WeChatMessageContext getWeChatMessageStrategy(Map params){
WeChatMessageContext weChatMessageContext;
String templateId = params.get("templateid").toString();
switch (templateId){
case "dMQlrS8McKf0uUx1qaIJ3y5m75T6czATBWvfj0flDQk" :
// 订单支付提醒
weChatMessageContext = new WeChatMessageContext(strategyMaps.get("orderPaymentNoticeStrategy"));
break;
case "YvAp93uNq-51o7dnlI5eVQG3aWuOElH6WLEDbW9lfbY":
// 退款通知
weChatMessageContext = new WeChatMessageContext(strategyMaps.get("refundNoticeStrategy"));
break;
case "tt4ghntVwWIYmNrZMxpgHqSsttxh96g7OUTP4YY9qCA":
// 订单送达提醒
weChatMessageContext = new WeChatMessageContext(strategyMaps.get("orderCompleteNoticeStrategy"));
break;
default:
weChatMessageContext = null;
}
// 返回要使用的策略
return weChatMessageContext;
}
}
4.新建文件 OrderPaymentNoticeStrategy
/*
*订单支付提醒实现类
*/
@Service
public class OrderPaymentNoticeStrategy implements WeChatMessageStrategy{
@Override
public JSONObject sendMessage(Map params) throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("touser", "");// 用户的openid
jsonObject.put("template_id", params.get("templateid").toString());// 订阅消息模板的id
// 构造发送的数据 data
JSONObject data = new JSONObject();
data.put("character_string1", new JSONObject().put("value", ""));// 订单号
data.put("phrase2", new JSONObject().put("value", ""));// 订单状态
data.put("amount6", new JSONObject().put("value", ""));// 支付金额
jsonObject.put("data", data);
return jsonObject;
}
}
5.新建文件 RefundNoticeStrategy
/*
*退款通知实现类
*/
@Service
public class RefundNoticeStrategy implements WeChatMessageStrategy{
@Override
public JSONObject sendMessage(Map params) throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("touser", "");// 用户的openid
jsonObject.put("template_id", params.get("templateid").toString());// 订阅消息模板的id
// 构造发送的数据 data
JSONObject data = new JSONObject();
data.put("amount1", new JSONObject().put("value", ""));// 退款金额
data.put("phrase2", new JSONObject().put("value", ""));// 退款原因
data.put("character_string3", new JSONObject().put("value", ""));// 退款单号
data.put("time4", new JSONObject().put("value", ""));// 退款时间
jsonObject.put("data", data);
return jsonObject;
}
}
6.订单送达提醒实现类不再编写,省略。。。
7.新建文件 WeChatMessageController 处理小程序端的请求
public class WeChatMessageController {
@Autowired
private WeChatMessageService weChatMessageService;
@RequestMapping(value="/sendMessageToUser", method = {RequestMethod.POST, RequestMethod.GET})
@NoAuth
@ResponseBody
public String sendMessageToUser(HttpServletRequest request){
Map params = Helper.getRequestParam(request);
try {
return weChatMessageService.sendMessageToUser(params);
} catch(Exception e){
return "系统错误,请稍后再试";
}
}
}
8.新建文件 WeChatMessageService 调用 策略工厂 WeChatMessageStrategyFactory
@Service
public class WeChatMessageService {
@Autowired
private WeChatMessageStrategyFactory weChatMessageStrategyFactory;
public String sendMessageToUser(Map params) throws Exception {
// 获取 access_token
String accessToken = getAccessToken();
// 消息推送 url
String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken;
// 根据传入的 模板id 调用策略工厂,获取策略环境
WeChatMessageContext weChatMessageContext = weChatMessageStrategyFactory.getWeChatMessageStrategy(params);
// 根据策略环境,调用具体的策略实现
JSONObject jsonObject = weChatMessageContext.sendMessage(params);
// 发送消息
JSONObject result = HttpClientUtil.Post(url, jsonObject);
return null;
}
以上代码可以拷贝自行测试,关于策略模式相关概念可自行查阅。