就在前不久完成的一个短信模块的开发中,发现之前公司短信模块的代码用的是一个不错的模式。 首先是一个抽象类
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>这样的结构
这里是代码的入口类

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