责任链模式
责任链模式的核心在链上, 链是有多个处理者组成的。就像流水线上的质检员。
定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

实现
抽象事件
抽象事件类型表明这类型的事件是需要被处理的。
1 2 3
| public interface IEvent { int getType(); }
|
具体的事件
不同类型的子类事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class EventClick implements IEvent { public int getType() { return 1; } } public class EventEnter implements IEvent { public int getType() { return 2; } } public class EventBlank implements IEvent { public int getType() { return 3; } }
|
抽象的事件处理器
定义了只有Ievent类型的事件会被处理。
1 2 3
| public interface IEventHandler { boolean check(IEvent event); }
|
具体的事件处理器
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
| public class ClickEventHandler implements IEventHandler {
public boolean check(IEvent event) { if (event.getType() != 1){ return false; } System.out.println("Father check Ok. "); return true; } }
public class EnterEventHandler implements IEventHandler {
public boolean check(IEvent event) { if (event.getType() == 2) { System.out.println("Husband Ok."); return true; } return false; } }
public class BlankEventHandler implements IEventHandler {
public boolean check(IEvent event) { if (event.getType() != 3) { return false; }
System.out.println("Son Ok"); return true;
} }
|
事件处理链
用于组织事件处理器,符合条件的处理器处理完成后或者没有处理器处理都会停止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class EventHandlerChain { private List<IEventHandler> eventChains = new ArrayList<IEventHandler>(); public void add(IEventHandler eventHandler) { eventChains.add(eventHandler); } public boolean check(IEvent event) { for (IEventHandler eventChain : this.eventChains) { if (eventChain.check(event)) { return true; } } return false; }
}
|
Use
可以随意组织责任链的顺序,然后检查需要检查的类型。
1 2 3 4 5 6 7 8
| EventHandlerChain chain = new EventHandlerChain(); chain.add(new ClickEventHandler()); chain.add(new EnterEventHandler()); chain.add(new BlankEventHandler());
chain.check(new EventClick()); chain.check(new EventEnter()); chain.check(new EventBlank());
|
应用
优点
将请求和处理分开。请求着可以不用知道是谁处理的,处理者可以不用知道请求着的全貌。
两者解耦,提高了系统的灵活性。
缺点
性能问题, 最差的情况下,请求从头遍历到尾,链条特别长的时候,性能损耗是个大的问题。
因此在使用的过程中要注意责任链的长短。
调试不方便。
在广告系统中,由不同的事件来触发不同类型的广告时根据责任链模式来处理。
每个Handler可以专注自己的业务处理逻辑。具体Handler还可以抽象一个抽象类,把公用的逻辑写在抽象类里面,每个具体的实现类只负责业务的处理即可(优化为模版方法模式)。