工厂模式和策略模式的使用

1.TemplateAbstract---消息模板抽象类(策略模式)

import com.danga.MemCached.MemCachedClient;
import com.google.gson.Gson;
import com.zhuzher.common.v3.po.AuthUser;
import com.zhuzher.commons.util.Constants;
import com.zhuzher.commons.util.StringUtil;
import com.zhuzher.commons.util.Tools;
import com.zhuzher.commons.util.WechatKit;
import com.zhuzher.vxs.dao.WinxinDao;
import com.zhuzher.vxs.po.AuthInfo;
import com.zhuzher.vxs.po.ReportThird;
import com.zhuzher.wechat.message.po.TemplateData;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;

/**
 * @authuser tk
 * @description  消息模板抽象类
 * @date 2019/6/12
 */

@Component
@Scope("prototype")
public abstract class TemplateAbstract {

    Logger log= Logger.getLogger(TemplateAbstract.class);

    @Autowired
    WechatKit wechatKit;
    @Autowired
    public WinxinDao winxinDao;

    private static final String DEFAULT_COLOR = "#173177";

    protected TemplateData templateData = new TemplateData();
    protected List> dataList = new ArrayList>();
    protected List keyList;
    protected String token;
    protected String openid;
    protected String tmpid;
    protected String wxcid;


    /**
     * init template id
     */
    public abstract void buildTemplateId();

    /**
     * init template key name
     */
    public abstract void buildKey();

    /**
     * create default skip url, if have not skip url , set blank  hahhhh`
     */
    public void  createDefaultSkipUrl(){};

    /**
     * init skip url
     * @param url
     * @return
     */
    public TemplateAbstract pushSkipUrl(String url){
        templateData.setUrl(url);
        return this;
    }

    /**
     * init key value
     * @param value
     * @return
     */
    public TemplateAbstract pushData(String value){
        pushData(value, DEFAULT_COLOR);
        return this;
    }

    /**
     * init key and color
     * @param value
     * @param color
     * @return
     */
    public TemplateAbstract pushData(String value, String color){
        Map item = new HashMap();
        item.put("value", value);
        item.put("color", color);
        dataList.add(item);
        return this;
    }

    /**
     * match key and data
     */
    public void buildData(){

        for(int i = 0; i < dataList.size(); i++){
            templateData.push(keyList.get(i), dataList.get(0).get("value"), dataList.get(0).get("color"));
        }
    }

    /**
     * init wxcid and sender
     * @param wxcid
     * @param openid
     * @return
     */
    public TemplateAbstract initParams(String wxcid, String openid){
        AuthUser authuser_new = wechatKit.getAuthUser(wxcid);
        if(authuser_new != null){
            this.token = authuser_new.getAuthorizer_access_token();
        }
        return this;
    }

    private void skipUrlHandleMethod(){
        if(StringUtil.isBlank(templateData.getUrl())){
            createDefaultSkipUrl();
        }
    }

    /**
     * invoke wechat msg
     */
    protected void sendWechatMsg(){
        try {
            log.debug("1-----发送模板消息----sendWechatMsg:"+(templateData == null ? null : (new Gson().toJson(templateData)))+";token:"+token);
            WechatKit.templateSend(token, templateData);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
    }

    /**
     * send msg(outer accesss)
     */
    public void sendMsg(){
        //初始化模版id
        buildTemplateId();
        //初始化当前要发送的模版类型的keyname
        buildKey();
        //初始化默认的跳转地址url
        skipUrlHandleMethod();
        //把key和data对应起来
        buildData();
        //发送消息
        sendWechatMsg();
    }

}

 

2.TemplateFactory--消息模板工厂类(工厂模式)

import com.zhuzher.template.abstracts.TemplateAbstract;
import com.zhuzher.template.service.impl.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * @authuser tk
 * @description 消息模板工厂类
 * @date 2019/6/12
 */

@Component
public class TemplateFactory {

    @Autowired
    RegisterSuccessTemplate registerSuccessTemplate;
    @Autowired
    RewardAccountEntryTemplate rewardAccountEntryTemplate;
    @Autowired
    OrderPaySuccessTemplate orderPaySuccessTemplate;
    @Autowired
    IntegralExchangeSuccessTemplate integralExchangeSuccessTemplate;
    @Autowired
    ConsultationReplyTemplate consultationReplyTemplate;


    public TemplateAbstract createTemplate(Integer typeid, String wxcid, String openid) {

        switch (typeid) {
            case 2 : //2-积分兑换成功通知
                return integralExchangeSuccessTemplate.initParams(wxcid, openid);
            case 94 : //94-订单支付成功通知
                return orderPaySuccessTemplate.initParams(wxcid, openid);
            case 100 : //100-粉丝成功注册提醒
                return registerSuccessTemplate.initParams(wxcid, openid);
            case 103 : //103-会员权益到账通知
                return rewardAccountEntryTemplate.initParams(wxcid, openid);
            case 104 : //104-咨询回复消息提醒
                return consultationReplyTemplate.initParams(wxcid, openid);
        }

        return null;
    }

}

 

3.RewardAccountEntryTemplate--实现类(会员权益到账通知)

package com.zhuzher.template.service.impl;

import com.zhuzher.commons.util.Constants;
import com.zhuzher.template.abstracts.TemplateAbstract;
import com.zhuzher.vxs.po.TemplateValue;
import com.zhuzher.wechat.message.po.TemplateData;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.HashMap;

/**
 * @authuser tk
 * @description     103----会员权益到账通知
 * @date 2019/6/12
 */

@Component
public class RewardAccountEntryTemplate extends TemplateAbstract {

    private String[] keyName ;
    private String[] keyName_old = {"first", "keyword1", "keyword2", "keyword3", "keyword4", "remark"};
    private String[] keyName_new = {"first", "keyword1", "keyword2", "keyword3", "remark"};
    private static String DEFAULT_SKIP_URL =Constants.SETTINGMAP.get(Constants.SETTING_BASE_URL_WX)+"/view/ticketManager.html?cid=";
    private Boolean version = false;//默认旧模板

    @Override
    public void buildTemplateId() {
        TemplateValue templateValue = winxinDao.queryTemplateValue(wxcid, 1, 103);
        if (templateValue != null) {
            super.tmpid = templateValue.getValue();
        }
        //判断当前酒店使用的模板是旧模板还是新模板
        if(templateValue.getUpdate_times() == TemplateValue.SET_UPDATE_TIMES_1){
            version=true;
        }
        if(version){//新模板--2019年04月19日
            this.keyName = keyName_old;
        }else{
            this.keyName = keyName_new;
        }
    }

    @Override
    public void buildKey() {
        super.keyList = Arrays.asList(keyName);
    }

    @Override
    protected void sendWechatMsg() {
        //新模板
        if(version){
            templateData.push("first",
                    templateData.getData()
                            .get("first")
                            .getValue()+",会员卡号:"+templateData.getData().get("keyword1").getValue()
                    );

            HashMap keyWordMap = templateData.getData();

            for(String key: keyWordMap.keySet()){
                if (key.equals("keyword1")){
                    keyWordMap.put(key,keyWordMap.get("keyword2"));
                }
                if (key.equals("keyword2")){
                    keyWordMap.put(key,keyWordMap.get("keyword3"));
                }
                if (key.equals("keyword3")){
                    keyWordMap.put(key,keyWordMap.get("keyword4"));
                }
            }
            keyWordMap.remove("keyword4");
        }
        super.sendWechatMsg();
    }


    /**
     * 创建默认的跳转地址
     */
    @Override
    public void createDefaultSkipUrl(){
        super.templateData.setUrl(DEFAULT_SKIP_URL + wxcid);
    }

}

4.WinxinServiceImpl--业务层实现类

TemplateAbstract templateAbstract = templateFactory.createTemplate(103, wxcid, openid);
templateAbstract
      .pushData(first)
      .pushData(cardno)
      .pushData(keyword2)
      .pushData(sourceStr)
      .pushData(DateDiff.currentDateTime());
   templateAbstract.sendMsg();

 

 

 

你可能感兴趣的:(Java文章)