0%

设计模式之Dubbo过滤器

在使用Dubbo过滤器时候,我们可以借鉴Dubbo过滤器的实现方式来设计一个类似与Dubbo过滤器的模式的实现方式。

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
58
public class FilterDemo {

static interface Invoker {
void invoke();
}

static interface Filter {
void invoke(Invoker invoker);
}

static class FilterA implements Filter {

@Override
public void invoke(Invoker invoker) {
System.out.println("filter a before invoker do invoke");
invoker.invoke();
System.out.println("filter a after invoker do invoke");
}
}

static class FilterB implements Filter {
@Override
public void invoke(Invoker invoker) {
System.out.println("filter b before invoker do invoke");
invoker.invoke();
System.out.println("filter b after invoker do invoke");
}
}

public static void main(String[] args) {
List<Filter> filterList = new ArrayList<>();
Filter filterA = new FilterA();
Filter filterB = new FilterB();

filterList.add(filterA);
filterList.add(filterB);

Invoker last = new Invoker() {
@Override
public void invoke() {
System.out.println("invoker do action");
}
};

for (int i = filterList.size() - 1; i >= 0; i--) {
Filter filter = filterList.get(i);
Invoker next = last;
last = new Invoker() {
@Override
public void invoke() {
filter.invoke(next);
}
};
}

last.invoke();
}
}

执行结果:

1
2
3
4
5
filter a before invoker do invoke
filter b before invoker do invoke
invoker do action
filter b after invoker do invoke
filter a after invoker do invoke