设计模式——行为模式(一)

Chain Of Responsibility(职责链)

目标

使多个对象都有机会处理请求,避免请求的发送者与接收者之间的耦合关系。将这些接受请求的对象连成一条链,使得请求顺着这条链被传递,直到某一个对象处理了它为止。

结构

结构图

其中Handler都具有着指向自己的后继者的指针,使得请求能够顺着职责链依次向下传递下去。

协作

安卓View的事件分发机制

当Client发送了一个请求给整个职责链之后,该请求将会顺着链条往下一直传递下去,直到某个对象处理了这个请求。(即返回true或者其他)

在安卓系统中,View事件的处理机制便是如此,先在向下发送的时候,通过onInterceptTouchEvent方法来决定事件是否将会顺着职责链向下传递,然后再通过onTouchEvent方法来决定处理之后会不会随着职责链向上继续被处理.

适用情形

  1. 当有多个对象都可以处理一个请求,并且由哪个对象处理是由根据运行时的不同情况而确定的;

  2. 需要在不明确有多少个接受者的情况下,向多个对象发送一个请求;

  3. 希望接受请求的对象是能够被动态指定的。

参与者

  1. Handler

    定义一个处理请求的接口;

  2. ConcreteHandler

    实现Handler接口中的方法,具有一个能够访问它的后继者的指针,当有一个请求的时候,如果可以处理这个请求就拦截处理,否则将会将请求继续发送给自己的后继者;

  3. Client

    一个发送请求的类。

效果

  1. 发送请求者不需要知道具体是哪一个对象处理了发送的请求,并且对于发送者和接受者来说,他们根本不会知道这个职责链的存在。这样降低了发送者与接收者、接受者之间的耦合度;

  2. 增强了给每一个对象指派职责的灵活性,使你可以通过动态地调整改变处理一个请求时所需要的职责;

  3. 不能够保证发送的这个请求一定会被处理,可能会顺着职责链发送到末段然后便被遗弃;

  4. 职责链可以通过已有的Composite链等进行传递,也可以通过创建一个全新的链条进行传递。当你现有的链接不能够很好的表示目前整个职责传递的时候,就需要创建新的链接来进行职责传递;

代码示例

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
class Boss {
protected Boss upperBoss;
public void setUpperBoss(Boss upperBoss) {
this.upperBoss = upperBoss;
}
}
interface Ratify{
void ratifyDayoff();
}
class ViceManager extends Boss implements Ratify{
@Override
public void ratifyDayoff() {
upperBoss.ratifyDayoff();
}
}
class GeneralManager extends Boss implements Ratify{
@Override
public void ratifyDayoff() {
System.out.println("Accept!");
}
}
public class Staff{
private Boss boss1, boss2;
public Staff() {
this.boss1 = new ViceManager();
this.boss2 = new ViceManager();
boss1.setUpperBoss(boss2);
}
public void askForDayoff() {
boss1.ratifyDayoff();
}
public static void main(String args[]) {
Staff staff = new Staff();
staff.askForDayoff();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.