Java设计模式之“策略模式”

本文以小程序订阅消息推送为例,由于各种消息模板不一样,及不同的消息推送的人群也不一样,所以每种消息要进行不同的封装及处理,为避免过多的 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;
    }

以上代码可以拷贝自行测试,关于策略模式相关概念可自行查阅。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值