设计模式(二) 适配器模式

Posted by hang.li on November 20, 2022

业务场景

  • 制作一个发送短信的接口, 注册, 重置密码方法都要使用
  • 系统对接的短信平台有好多,阿里,腾讯,华为
  • 每个平台都有自己的sdk可以使用
  • 短信大致可分为几类如: 验证码短信,通知类短信

    UML类图

  • 调用者只依赖SmsService接口(组合关系),当有平台的sdk有变化或者增加短信平台时,可避免大量修改调用者代码 img.png

    代码

    各个适配器中的代码看起来可能一样,但是不同平台都有自己处理参数和调用的方法,实际实现还是有区别的

  • Demo.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class Demo {
    SmsService smsService;
    /**
     * 注册方法
     */
    public void regist() {
        String smsType = "huawei";
        sendCodeSMS(smsType, new HashMap<>());
    }

    /**
     * 重置密码方法
     */
    public void resetPassword() {
        String smsType = "huawei";
        sendCodeSMS(smsType, new HashMap<>());
    }

    public Map sendCodeSMS(String smsType, Map<String, String> paramMap) {
        if ("ali".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new AliSmsAdapter();
        } else if ("tencent".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new TencentSmsAdapter();
        } else if ("hauwei".equals(smsType)) {
            // TODO 可实现按照适配器命名规则, 利用反射初始化适配器
//            smsService = new HuaweiSmsAdapter();
        }
        return smsService.sendCodeSMS(paramMap);
    }
}
  • SmsService.java
1
2
3
4
5
6
7
8
9
10
11
12
public interface SmsService {
    /**
     * 发送验证码类的短信方法
     * 传递一些需要的参数
     */
    Map<String, String> sendCodeSMS(Map<String, String> paramMap);
    /**
     * 发送通知类的短信方法
     * 传递一些需要的参数
     */
    Map<String, String> sendTextSMS(Map<String, String> paramMap);
}
  • AliSmsAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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;
    }
}
  • HuaweiSmsAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class HuaweiSmsAdapter implements SmsService {
    /**
     * 发送验证码类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendCodeSMS(Map<String, String> paramMap) {
        // 1. 创建HuaweiSDK客户端
        System.out.println("创建HuaweiSDK客户端!");
        // 2. 处理参数, 封装成适合HuaweiSDK适合的参数
        System.out.println("处理参数, 封装成适合HuaweiSDK适合的参数!");
        // 3.调用发送验证码短信方法,接收返回结果
        System.out.println("调用发送短信方法,接收返回结果!");
        // 4. 处理返回结果给调用者
        return null;
    }

    /**
     * 发送通知类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendTextSMS(Map<String, String> paramMap) {
        // 1. 创建HuaweiSDK客户端
        System.out.println("创建HuaweiSDK客户端!");
        // 2. 处理参数, 封装成适合HuaweiSDK适合的参数
        System.out.println("处理参数, 封装成适合HuaweiSDK适合的参数!");
        // 3.调用发送通知类短信方法,接收返回结果
        System.out.println("调用发送通知类短信方法,接收返回结果!");
        // 4. 处理返回结果给调用者
        return null;
    }
}
  • TencentSmsAdapter.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class TencentSmsAdapter implements SmsService {
    /**
     * 发送验证码类的短信方法
     * 传递一些需要的参数
     *
     * @param paramMap
     */
    @Override
    public Map<String, String> sendCodeSMS(Map<String, String> paramMap) {
        // 1. 创建TencentSDK客户端
        System.out.println("创建TencentSDK客户端!");
        // 2. 处理参数, 封装成适合TencentSDK适合的参数
        System.out.println("处理参数, 封装成适合TencentSDK适合的参数!");
        // 3.调用发送验证码短信方法,接收返回结果
        System.out.println("调用发送短信方法,接收返回结果!");
        // 4. 处理返回结果给调用者
        return null;
    }

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