业务场景
- 制作一个发送短信的接口, 注册, 重置密码方法都要使用
- 系统对接的短信平台有好多,阿里,腾讯,华为
- 每个平台都有自己的sdk可以使用
- 短信大致可分为几类如: 验证码短信,通知类短信
UML类图
- 调用者只依赖SmsService接口(组合关系),当有平台的sdk有变化或者增加短信平台时,可避免大量修改调用者代码
代码
各个适配器中的代码看起来可能一样,但是不同平台都有自己处理参数和调用的方法,实际实现还是有区别的
- 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;
}
}