设计模式(四) 模板模式

借用设计模式(二)中的案例

问题分析

  • 拿AliSmsAdapter举例
public class AliSmsAdapter implements SmsService {
    /**
     * 发送验证码类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendCodeSMS(Map<String, String> paramMap) {
        // 1. 创建aliSDK客户端
        System.out.println("创建aliSDK客户端!");
        // 2. 处理参数, 封装成适合aliSDK适合的参数
        System.out.println("处理参数, 封装成适合aliSDK验证码类短信适合的参数!");
        // 3.调用发送验证码短信方法,接收返回结果
        System.out.println("调用发送短信方法,接收返回结果!");
        // 4. 处理返回结果给调用者
        return null;
    }

    /**
     * 发送通知类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendTextSMS(Map<String, String> paramMap) {
        // 1. 创建aliSDK客户端
        System.out.println("创建aliSDK客户端!");
        // 2. 处理参数, 封装成适合aliSDK适合的参数
        System.out.println("处理参数, 封装成适合aliSDK通知类短信适合的参数!");
        // 3.调用发送通知类短信方法,接收返回结果
        System.out.println("调用发送通知类短信方法,接收返回结果!");
        // 4. 处理返回结果给调用者
        return null;
    }
}
  • 每次调用sdk中的方法都要写一遍初始化SDK客户端的代码. 可以定义一个模板,初始化sdk客户端的过程交给模板,方法内只处理自己的逻辑.
  • 模板可以按照类内的各个方法抽取,也可以跨类抽取

修改后代码

public class AliSmsAdapter implements SmsService {
    /**
     * 发送验证码类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendCodeSMS(Map<String, String> paramMap) {
        return initClientTemplate(() -> {
            // 1. 处理参数, 封装成适合aliSDK适合的参数
            System.out.println("处理参数, 封装成适合aliSDK适合的参数!");
            // 2.调用发送验证码短信方法,接收返回结果
            System.out.println("调用发送短信方法,接收返回结果!");
            // 3. 处理返回结果给调用者
            return null;
        });
    }

    /**
     * 发送通知类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendTextSMS(Map<String, String> paramMap) {
        return initClientTemplate(() -> {
            // 1. 处理参数, 封装成适合aliSDK适合的参数
            System.out.println("处理参数, 封装成适合aliSDK适合的参数!");
            // 2.调用发送通知类短信方法,接收返回结果
            System.out.println("调用发送通知类短信方法,接收返回结果!");
            // 3. 处理返回结果给调用者
            return null;
        });
    }

    /**
     * 定义的模板
     * @param handler 每个方法定制的逻辑
     * @return
     */
    private Map<String, String> initClientTemplate(ExecServiceHandler handler) {
        // 初始SDK客户端
        System.out.println("创建aliSDK客户端!");
        // TODO 可以定义更多的相同的逻辑
        return handler.execute();
    }

    /**
     * 自定义执行方法的接口
     * java8中定义了几个函数式接口,如果满足要求可以直接使用
     */
    interface ExecServiceHandler{
        Map<String, String> execute();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值