原创

模板方法模式的实际应用-平台对接


模板方法模式的实际应用-平台对接

开发场景:平台之间数据同步时的数据发送

文件目录结构:

├── bean -- bean包
|    ├── ABean -- 服务A要传输的数据类型
|    ├── BBean -- 服务B要传输的数据类型
|    ├── ModelBean -- 父类bean,用于统一记录发送时间和结果
├── service -- service包
|    ├── impl -- 实现包
|    |    ├── AServiceImpl -- 发送ABean的服务类
|    |    ├── BServiceImpl -- 发送BBean的服务类
|    ├── IModelService -- 创建模板方法用到的公共方法接口,想要发送必须实现这个接口
├── model -- model包
|    ├── ModelServiceImpl -- 模板类

先创建好需要用到的bean,即ABeanBBean和他们的父类ModelBean

package com.test.bean;

import java.util.Date;

/**
 * @Author: 陌攻
 * @Description: 父类bean,用于统一记录发送时间和结果
 * @Date: Created in 13:47 2021/4/17
 * @Modified By:
 */
public class ModelBean {
    private Date sendTime;//发送时间
    private boolean flag;//发送结果

    public Date getSendTime() {
        return sendTime;
    }

    public void setSendTime(Date sendTime) {
        this.sendTime = sendTime;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}
package com.test.bean;

/**
 * @Author: 陌攻
 * @Description: 服务A要传输的数据类型
 * @Date: Created in 13:32 2021/4/17
 * @Modified By:
 */
public class ABean extends ModelBean{
    private String a;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }
}
package com.test.bean;

/**
 * @Author: 陌攻
 * @Description: 服务B要传输的数据类型
 * @Date: Created in 13:52 2021/4/17
 * @Modified By:
 */
public class BBean extends ModelBean{
    private String b;

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
}

创建模板方法用到的公共方法接口,想要发送必须实现这个接口:

package com.test;

import com.test.bean.ModelBean;

import java.util.List;

/**
 * @Author: 陌攻
 * @Description: 模板方法要调用的方法
 * @Date: Created in 1:44 2021/4/17
 * @Modified By:
 */
public interface IModelService<D extends ModelBean> {
    List<D> getData();//获取要发送的数据集
    String getUrl();//获取要发送的地址
    List<D> setValue(List<D> data);//填充默认值
    void save(List<D> data);//保存发送记录
}

创建模板类:

package com.test;

import com.test.bean.ModelBean;

import java.util.Date;
import java.util.List;

/**
 * @Author: 陌攻
 * @Description: 模板类
 * @Date: Created in 1:45 2021/4/17
 * @Modified By:
 */
public class ModelServiceImpl {
    //模板方法
    public void send(IModelService modelService){
        List<ModelBean> data = modelService.getData();//获取数据
        modelService.setValue(data);//填充默认值
        //数据加密。。。
        boolean re=this.postDate(data,modelService.getUrl());//发送数据
        Date time = new Date();
        for (ModelBean bean :data) {
            bean.setSendTime(time);//记录发送时间
            bean.setFlag(re);//记录发送结果
        }
        modelService.save(data);//记录已发送数据
    }
    //发送数据
    private boolean postDate(Object data,String url){
        //编写发送逻辑:在header添加密钥和时间戳然后用hutool工具类进行发送。。。
        return true;
    }
}

创建发送ABean的服务类,在send()方法中调用模板方法,然后以this作为传入参数,表示以AServiceImpl服务类作为IModelService接口的实现类

package com.test.service;

import com.test.IModelService;
import com.test.ModelServiceImpl;
import com.test.bean.ABean;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 陌攻
 * @Description:
 * @Date: Created in 13:31 2021/4/17
 * @Modified By:
 */
@Service
public class AServiceImpl implements IModelService<ABean> {

    @Autowired
    private ModelServiceImpl modelService;

    //发送数据
    public void send(){
        modelService.send(this);
    }

    @Override
    public List<ABean> getData() {
        //分页查询数据集,返回数据
        List<ABean> aBeans = new ArrayList<>();
        return aBeans;
    }

    @Override
    public String getUrl() {
        //返回要发送的子路径
        return "/url/one";
    }

    @Override
    public List<ABean> setValue(List<ABean> data) {
        for (ABean bean :data) {
            if(StringUtils.isEmpty(bean.getA())){
                bean.setA("默认值");
            }
        }
        return data;
    }

    @Override
    public void save(List<ABean> data) {
        //保存已发送的数据
    }
}

创建发送BBean的服务类,在send()方法中调用模板方法,然后以this作为传入参数,表示以BServiceImpl服务类作为IModelService接口的实现类

package com.test.service;

import com.test.IModelService;
import com.test.ModelServiceImpl;
import com.test.bean.BBean;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: 陌攻
 * @Description: 发送BBean的服务类
 * @Date: Created in 13:46 2021/4/17
 * @Modified By:
 */
@Service
public class BServiceImpl implements IModelService<BBean> {
    @Autowired
    private ModelServiceImpl modelService;

    //发送数据
    public void send(){
        modelService.send(this);//调用模板方法进行数据发送
    }

    @Override
    public List<BBean> getData() {
        //分页查询数据集,返回数据
        List<BBean> aBeans = new ArrayList<>();
        return null;
    }

    @Override
    public String getUrl() {
        //返回要发送的子路径
        return "/url/two";
    }

    @Override
    public List<BBean> setValue(List<BBean> data) {
        for (BBean bean :data) {
            if(StringUtils.isEmpty(bean.getB())){
                bean.setB("默认值");
            }
        }
        return data;
    }

    @Override
    public void save(List<BBean> data) {
        //保存已发送的数据
    }
}

这样一个大概的流程就写好了,其中把发送加密逻辑抽取到一个模板方法里面就是模板设计模式的一种应用。

java
  • 作者:陌攻(联系作者)
  • 发表时间:2021-06-26 15:30
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论