责任链模式的定义
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
责任链模式的UML类图
责任链模式的一种实现如下:
<code>public abstract class Handler{
private Handler next;
public void setNextHandler(Handler next){
this.next=next;
}
public Handler getNext(){
return next;
}
// 是否存在下游Handler
public boolean hasNext(){
return nextHandler != null;
}
//处理请求的方法
public abstract void handleRequest(Object request);
}
// ConcreteHandler
public class ConcreteHandler implements Handler{
public void handleRequest(Object request) {
if(match(Object)) {
// TODO: Handle the request
}
if(hasNext()) {
getNext().handleRequest(request);
}
}
}/<code>
责任链模式的优点
降低对象间的耦合
避免请求发送者与多个请求处理者耦合在一起,且请求处理对象持有一个指向其后继处理器的引用,无需感知整个责任链结构。
易扩展
如果需要添加新的请求处理类,直接通过实现Handler接口进行扩展。
职责灵活调整
通过动态改变责任链内的节点顺序和每个处理类的匹配条件,实现责任链的灵活处理。
模块化,职责更趋向单一
责任链上的每个请求处理类只需要处理自己的工作,各个处理类间的职责划分明确。
责任链模式的缺点
不能保证每个请求一定被处理
不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理,如果每个处理类都未处理,考虑默认处理器。
长职责链带来的性能问题
请求处理的对象越多则构造的责任链越长,职责在责任链中串行处理,如果对象比较多,或处理非常耗时,系统性能将受到一定影响
增加了客户端处理复杂性
客户端需要感知责任处理器的存在,并由客户端基于业务规则建立合理的责任链,提高了客户端逻辑的复杂度。
遵循的OOP原则
开闭原则
通过实现Handler接口进行责任处理类的扩展,无需修改原有代码。
单一职责原则
每个请求处理类具有内聚性的职责,职责被分派到不同的Handler中
里氏替换原则
责任链模式基于抽象接口是实现,面向接口编程
应用场景
- 如果多个对象可以处理同一个请求,但具体由哪个对象处理在运行时刻动态决定。
- 在请求处理者不明确的情况下向多个对象中的一个提交请求
- 需要动态指定处理一个请求的对象集合
閱讀更多 瘋狂架構 的文章