IT Panda Blog

Life is fantastic


  • Home

  • Tags

  • Categories

  • Archives

Desig Pattern - Chain Of Responsiblity

Posted on 2019-10-27 In design pattern

Mybatis中的Plugin是依赖Interceptor接口实现的,这里面还用到了责任链模式 Chain of responsibility

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interceptorChain.addInterceptor(interceptor);


public class InterceptorChain {

private final List<Interceptor> interceptors = new ArrayList<>();

public Object pluginAll(Object target) {
for (Interceptor interceptor : interceptors) {
target = interceptor.plugin(target);
}
return target;
}

public void addInterceptor(Interceptor interceptor) {
interceptors.add(interceptor);
}
}

上面的InterceptorChain在调用pluginAll的时候会应用所有的plugin

1
2
3
default Object plugin(Object target) {
return Plugin.wrap(target, this);
}

具体的就是,依次生成JDK dynamic proxy对象,并且将对具体statement的调用应用拦截器,形成调用链,及责任链模式。

如图所示

举个栗子:

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
# Reviewer基础类
public abstract class Reviewer {
public Reviewer nextReviewer;
Reviewer addReviewer(Reviewer nextReviewer){
return this.nextReviewer=nextReviewer;
}

abstract void reviewCode(String code);
public void review(String code){
reviewCode(code);
if(nextReviewer!=null){
nextReviewer.review(code);
}
}
}
#几种实现
public class SelfReview extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + " \n self review done \n");
}
}
public class PeerReviewer extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + " \n peer review done \n");
}
}
public class TeamLeadReviewer extends Reviewer {
@Override
public void reviewCode(String code) {
System.out.println(code + "\n team lead review done \n");
}
}
#测试
public static void main(String[] args){
String code = "hello world";
Reviewer selfReviewer = new SelfReview();
Reviewer peerReviewer = new PeerReviewer();
Reviewer teamLeadReviewer = new TeamLeadReviewer();
selfReviewer.addReviewer(peerReviewer);
peerReviewer.addReviewer(teamLeadReviewer);
selfReviewer.review("Hello world");
}

责任链的作用很明显了,解藕,可以在sender和receiver之间添加更多的逻辑

design pattern
Mybatis Plugin
记一次Mysql死锁deadlock
Rex

Rex

25 posts
26 categories
49 tags
Links
  • GitHub
© 2019 – 2020 作者拥有版权,转载请注明出处