刚学习java设计模式时对设计模式没有多少概念,其实自己在不知不觉中也在应用设计模式,今天就给大家分享一篇自己用的模板设计模式的实例吧
先说说概念,这个不用唠叨,用最通俗的一句话就是上有政策,下有对策,大的方向和指导方针领导已经定好了,具体怎么做,就要看你自己的实现了。基本的算法和步骤都是一定的模式,只不过你的实现不一样,现在下面为大家讲一个最常用事务回滚的模板用法:
业务背景是这样的,有一个这样的需求,有一个公共的平台来实现预约挂号,但是挂号是不同医院的,不同医院提供的有不同的接口和协议,所以要做成统一,这样就首先抽象出来一个接口,但是大家也知道单单一个接口做不了具体业务,所以还需要一个抽象类先实现这个接口来定义这个模板的具体算法和步骤,比如这个现在是先调用外部医院接口的方法,第二个就是写入数据库的方法,第三个写入日志的方法。这三个方法的步骤是先调用第一个,成功与否都要写入数据库,如果写入失败则要将之前的接口再次调用取消掉,然后记录日志,那具体方法应该如下
接口类
package test;
//接口类
public interface CommonInterface{
//调用外部医院接口
public Response reserverHospital(Request req);
//调用外部取消医院接口
public Response cancelReserverHospital(Request req);
}
//抽象类
package test;
public abstract class CommonAbstr implements CommonInterface{
public Response reserver(Request req,Order order,StaffLogger staffLogger){
try{
Response rs=this.reserverHospital(req);
//如果成功了,写入订单表
placeOrder(order);
}catch (Exception e) {
//预约失败,调用取消接口
cancelReserverHospital(req);
}finally{
//无论如何都是要记录数据库日志
insertOpertLog(staffLogger);
}
//根据之前的结果来定义返回结果
Response rs=new Response();
return rs;
}
//调用外部医院接口
public abstract Response reserverHospital(Request req);
//写入数据库接口
public Response placeOrder(Order order){
//具体写入数据库
return null;
}
//调用外部取消医院接口
public abstract Response cancelReserverHospital(Request req);
//写入数据库日志
public boolean insertOpertLog(StaffLogger staffLogger){
//统一写入操作日志
return true;
}
}
//具体实现类
医院1实现类
package test;
public class HospitalImpl1 extends CommonAbstr implements CommonInterface {
@Override
public Response cancelReserverHospital(Request req) {
//取消医院1具体实现
return null;
}
@Override
public Response reserverHospital(Request req) {
//预约医院1具体实现
return null;
}
}
医院2实现类
package test;
public class HospitalImpl1 extends CommonAbstr implements CommonInterface {
@Override
public Response cancelReserverHospital(Request req) {
//取消医院2具体实现
return null;
}
@Override
public Response reserverHospital(Request req) {
//预约医院2具体实现
return null;
}
}
大家纵观以上代码,其实大体上流程和步骤在抽象类中已经完全定义好了,只不过具体实现在医院接口预约和取消预约上存在差异,所以,具体实现类只需要完成业务方法的实现即可,只就是一个简单的模板模式的实现。