借用设计模式(二)中的案例
问题分析
- 拿AliSmsAdapter举例
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;
}
}
- 每次调用sdk中的方法都要写一遍初始化SDK客户端的代码. 可以定义一个模板,初始化sdk客户端的过程交给模板,方法内只处理自己的逻辑.
- 模板可以按照类内的各个方法抽取,也可以跨类抽取
修改后代码
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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();
}
}