项目中好的代码模式

195 阅读2分钟

就在前不久完成的一个短信模块的开发中,发现之前公司短信模块的代码用的是一个不错的模式。 首先是一个抽象类

public abstract class SmsTemplate<R,S> {

/**
 * @param sb
 *            短信实体类
 * @return
 */
public boolean doProcess(SmsBean sb) {
    boolean flag = false;
    try {
        // 将入参转成指定短信模版
        S specifiesMsg = template(sb);
        log.info("短信内容==>"+ JSONObject.toJSONString(specifiesMsg));
        // 发送请求到渠道不同的渠道商
        R messageResult = doSend(specifiesMsg);
        log.info("短信请求结果=>"+messageResult);
        // 获取渠道返回的结果
        flag = parseResultToBoolean(messageResult);
        // 写入到DB中
        if(flag){
            if(writeToDb(sb) > 0){
                return flag = true;
            }
        }
    } catch (Exception e) {
        log.error("e{}",e);
    }
    return flag;
}

/**
 * 获取对应的短信模版
 * @param sb
 * @return
 */
protected abstract S template(SmsBean sb);

/**
 * 包装数据发送到渠道
 * @param specifiesMsg
 * @return
 */
protected abstract R doSend(S specifiesMsg);

/**
 * 统一处理结果
 * @param messageResult
 * @return
 */
protected abstract boolean parseResultToBoolean(R messageResult);

/**
 * 保存短信相关的信息
 * @param sb
 * @return
 */
protected abstract int writeToDb(SmsBean sb);

因为短信会有不同的渠道商,所有之后接入的渠道上都可以直接继承这个类, 介绍一下这个类的一些方法(方法的注释已经很清楚了),真正执行的是doProcess()这方法,而在这个方法中第一个执行的是template()这个方法,这个方法主要是因为我们的短信模版是通过读取配置来的,模版中的一些关键地方需要替换就是在这个方法中完成的。 哦,对了忘记介绍SmsBean这个POJO对象了

public class SmsBean {

	private String url;	// 短信渠道发送短信的url
	private String mobile;//手机号
	private String account;//短信账号
	private String password;//短信密码
	private String verifyCode;//验证码
	private Integer smsType;//短信模版的kye
	private Integer type;//模板类型
	private String content;//短信内容
	private String smsSignature;//短信签名
	
	
	public SmsBean(String url, String mobile, String account, String password, String verifyCode, Integer smsType,
                   Integer type, String smsSignature) {
		this.url = url;
		this.mobile=mobile;
		this.account=account;
		this.password=password;
		this.verifyCode=verifyCode;
		this.smsType=smsType;
		this.type=type;
		this.smsSignature=smsSignature;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.mobile = password;
	}
	
	
	public String getVerifyCode() {
		return verifyCode;
	}
	public void setVerifyCode(String verifyCode) {
		this.verifyCode = verifyCode;
	}
	
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
	public String getSmsSignature() {
		return smsSignature;
	}
	public void setSmsSignature(String smsSignature) {
		this.smsSignature = smsSignature;
	}
	public Integer getSmsType() {
		return smsType;
	}
	public void setSmsType(Integer smsType) {
		this.smsType = smsType;
	}
	public Integer getType() {
		return type;
	}
	public void setType(Integer type) {
		this.type = type;
	}
}

这个实体类中的字段注释已经写的很清楚了,这里说一个字段 private Integer smsType;//短信模版的kye 这个字段是和我们的短信模版有关的,具体的说就是模版中key的值,模版是一个list里面存储的是一个Map<String,List>这样的结构

这里是代码的入口类

之前还写过支付功能,周末回去把原来写的代码重构一下用上面这种模式。