最近项目遇到一个需求,写一个预警的功能,然后预警的方式可能是多个,比如通过短信预警,可能通过App内消息推送预警,也有可能是微信内的推送预警,然后就写了一个这个东西 ;
大致思路如下:
预警分为三个步骤:
- 查询预选数据
- 匹配预警规则,满足规则的加入发送预警队列
- 构造短信内容
具体实现如下:
- 接口
- 实现三个方法:查询数据 buildData 匹配规则 rule 构造结果内容 buildResult
public interface WarnService {
/**
* 规则匹配器
* @author fenglu
* @return
* @date 2019年11月14日 下午2:06:01
*/
void buildRule(List<GeneralResult> results,List<WarnReceiverEntity> receivers);
/**
* 构建数据源
* @author fenglu
* @date 2019年11月14日 下午2:06:43
*/
void buildData(Map<Integer, List<Integer>> proRelevancy);
/**
* 构建结果集
* @description
* @author fenglu
* @return
* @date 2019年11月14日 下午2:07:04
*/
void buildResult();
/**
* 执行
*/
void execute();
}
- 抽象类
- 抽象类实现该接口,并且实现接口中的四个方法,算是一个基本的实现类
public abstract class AbstractWarnserviceImpl extends CommonServiceImpl implements WarnService{
@Autowired
private CacheServiceI cacheService;
@Override
public void buildRule(List<GeneralResult> results,List<WarnReceiverEntity> receivers) {
}
@Override
public void buildData(Map<Integer, List<Integer>> proRelevancy) {
getData(proRelevancy);
}
/**
* 获取通用结果集
* @author fenglu
* @param proRelevancy {warnType:[proid1,proid2,proid3...],...}
* @date 2019年11月15日 上午10:44:00
*/
private void getData(Map<Integer, List<Integer>> proRelevancy) {
}
@Override
public void buildResult() {
// TODO Auto-generated method stub
}
@Override
public void execute() {
}
private Map<Integer, List<Integer>> getProRelevancy(Map<Integer, List<WarnEntity>> projectConfig) {
Map<Integer, List<Integer>> relevancy = new HashMap<Integer, List<Integer>>();
return relevancy;
}
private Map<Integer, List<WarnEntity>> findProjectConfig() {
return projectWarnMap;
}
/**
* 发送模式
* @description
* @author fenglu
* @date 2019年11月15日 上午10:43:35
*/
public void sendMode(){
}
/**
* 信息结果处理
* @description
* @author fenglu
* @date 2019年11月15日 上午10:43:31
*/
public void msgResult(){
}
}抽象类中的代码不用细看,主要就是实现了接口的四个方法
- 实现类
- 实现类继承上面的抽象类,重写sendMode方法,用来实现不同的发送方式,如果我们想自定义规则,也可以重写rule方法。
总结:这就是接口-抽象类-实现类的思路,主要还是为了将一个功能扩展。想法比较简单。