前言
- 该模式是行为设计模式之一.如果说android中该模式应用最具代表性的例子的话就是android的触摸机制.大家此时可以想想android的点击事件传递和拦截机制那幅图,就能更好的理解这个模式啦.如果想不起来也没关系,这里贴出来这个图.(以前自己画的,有点丑,大家也可以自行百度哈,不影响理解(^__^) ).
定义
- 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一个链,并沿着这条链传递该请求.只到有对象处理它为止.
- 使用场景:
1.多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定.
2.在请求处理不明确的情况下向多个对象中的一个提交一个请求.
3.需要动态指定一组对象处理请求. - 优点:可以对请求者和处理者关系解耦,提高代码的灵活性.
- 缺点:对链中处理者的遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用中,需要慎重
- -
UML类图
- 简单责任链模式:请求相对单一
- 复杂责任链模式:请求和对应的处理规则不尽相同
- 这里未找到UML类图,见书上P167,其实也就是把请求和处理规则分别进行封装
实现步骤
- 简单的责任链模式的实现:
- Handler:抽象处理者
/**
* 抽象处理者
* @author max
*
*/
public abstract class Handler {
public Handler successor;//下一个节点处理者
public abstract void handleRequest(String condition);
}
- concreteHandler:具体处理者角色
/**
* 具体的处理者1
* 不是就继续传递
* @author max
* */
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("1")) {
System.out.println("处理1");
}else{
successor.handleRequest(condition);//否则就继续发送
}
}
}
- 当然以上只是简单的实现了责任链模式的思路,但是在具体场景中,往往请求和相应的处理规则都不是这么简单.那么下面就是复杂一些的责任链模式的实现.
这里就显示请求和处理规则的封装代码,具体实现请看模拟公司报账传递的demo吧
AbstractHandler:抽象处理者
/**
* 抽象处理者
* @author max
*
*/
public abstract class AbstractHandler {
public AbstractHandler nextHandler; //下一个节点的处理者
//处理请求
public final void handleRequest(AbstractReuqest reuqest){
if (getHandleLevel() == reuqest.getReqsuetLevel()) {//处理级别一致就处理
handle(reuqest);
}else{
//否则就传递给下一个处理者
if (null != nextHandler) {
nextHandler.handleRequest(reuqest);
}else{
//当所有处理者对象均不能处理该请求时输出
System.out.println("都处理不了");
}
}
}
//获取处理者对象的处理级别
public abstract int getHandleLevel();
//每个处理对象的具体处理方式
public abstract void handle(AbstractReuqest reuqest);
}
- AbstractReuqest:抽象请求者
/**
* 抽象请求者
* @author max
*
*/
public abstract class AbstractReuqest {
private Object object;//处理对象
public AbstractReuqest(Object object) {
this.object = object;
}
//获取处理的内容对象
public Object getObject() {
return object;
}
//获取请求级别
public abstract int getReqsuetLevel();
}
源码下载
这里是demo目录.模块分别是调用实现;复杂模式请求和处理规则的封装;模拟公司报账传递的demo;简单模式原理;