责任链模式

责任链设计模式(Chain of Responsibility Pattern)

简单介绍

举个栗子,还是拿支付系统来说。用户下了一个订单,那么我们需要处理用户是否使用了优惠券、活动等等

我们把订单处理的整个流程用链表的形式穿插起来,就可以形成一个责任链的形式。

当一个用户下了订单,并使用了优惠券但没有使用活动,在责任链处理中,发现用户没有参加活动,则不进行处理继续调用责任链下一步处理,遇到优惠券Handler的时候,则对其进行操作。

image

代码实现

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 interface BaseHandler{
void doSomething(String input,BaseHandler baseHandler);
}

public class ChainHandler implements BaseHandler{
// 责任链全部调度任务
private List<BaseHandler> handlers = new ArrayList<>();
// 责任链下标
private int index;

public ChainHandler addHandler(BaseHandler baseHandler){
handlers.add(baseHandler);
return this;
}

public void doSomething(String input,BaseHandler baseHandler){
// 若下标行至数组底部,则不执行
if(index==handlers.size()) return;
// 取出任务
BaseHandler handle = handlers.get(index);
// 下标向下滑动
index ++;
handler.doSomething(input,this);
}
}

public class CouponHandler{
@Override
public void doSomething(String input,BaseHandler baseHandler){
if("优惠券".equals(input)){
System.out.println("优惠券");
// 若是只想在链中只让一个去处理则在处理的链中retur掉
// return; 停止链的调用
}
baseHadler.doSomething(input,baseHandler);
}
}
public class ActivityHandler{
@Override
public void doSomethig(String input,BaseHanndler baseHandler){
if("活动".equals(input)){
System.out.println("活动");
}
baseHandler.doSomething(input,BaseHandler);
}
}

public class Test{
public static void main(String args[]){
//创建责任链
ChainHandler chainHandler = new ChainHandler();
//给责任链添加任务
chainHandler.addHandler(new CouponHandler())
.addHandler(new ActivityHandler());
//调用责任链
chainHandler.doSomething("优惠券",chainHandler);
}
}

小结

可能有些人还没有理解这个责任链,不妨先自己用代码写写看。也许多写两边就能明白这个是什么意思啦

じゃあ、まだ今度会いましょう〜