责任链模式
一、简介
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为知。
二、使用场景
- 多个对象可以处理同一请求,但是具体使用哪个对象处理需要在运行时动态决定。
- 需要动态指定一组对象处理请求
- 在请求处理者不明确的情况下向多个对象中的一个提交一个请求
三、简单实现
这里以View对触摸事件的分发处理为例,实现一个简单版的事件分发机制。
//View 类
public abstract class View {
protected View childView;
public abstract boolean onTouchEvent();
public void dispatchTouchEvent(){
if (!onTouchEvent()){
if (childView!=null){
childView.onTouchEvent();
}else {
Log.i(TAG, "dispatchTouchEvent: can not handle");
}
}
}
}
//具体view
public class View1 extends View{
@Override
public boolean onTouchEvent() {
return false;
}
}
public class View2 extends View{
@Override
public boolean onTouchEvent() {
return false;
}
}
public class View3 extends View{
@Override
public boolean onTouchEvent() {
return false;
}
}
public void main(){
View1 view1=new View1();
View2 view2=new View2();
View3 view3=new View3();
view1.childView=view2;
view2.childView=view3;
view1.dispatchTouchEvent();
}
四、小结
责任链中一个处理者对象只有两个行为:处理请求、将请求转发至下一个处理者。这里需要注意一个处理者不能处理请求后再把请求转发至上一个请求者。
对于一个请求也有两种情况一是请求被某个处理者所处理二是没有被任何一个处理者处理。前者又称为纯的责任链后者又被称为不纯的责任链。
责任链模式可以把请求和处理解耦提高代码的灵活性但是其缺点也很明显就是如果处理者太多那么遍历必定会影像性能。