一、定义:责任链模式使第一个对象处理请求,然后一次向下传递请求,直到有一个合适的对象能够处理他,从而避免的调用者依次去询问各个对象造成的多耦合关系。Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the reviever objects and pass the request along the chain until an object handles it
二、简单代码示例:
public abstract class Handler {
private Handler nextHandler;
private String myName;
private Integer request;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public void setMyName(String myName) {
this.myName = myName;
}
public void setRequest(Integer request) {
this.request = request;
}
public final String handleMessage(int request) {
if (request == this.request)
return myName;
else if (this.nextHandler != null)
return this.nextHandler.handleMessage(request);
else
return "No one";
}
public class Object1 extends Handler {
public Object1(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}
//Other method in object1
}
public class Object2 extends Handler {
public Object2(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}
//other method in Object2
}
public class Object3 extends Handler {
public Object3(String name, int age, Handler next) {
setMyName(name);
setRequest(age);
setNextHandler(next);
}
// other method in Object3
}
场景调用:
public static void main(String[] args) {
// TODO Auto-generated method stub
Handler handler3 = new Object3("小红", 12, null);
Handler handler2 = new Object3("小明", 11, handler3);
Handler handler1 = new Object3("小芳", 10, handler2);
System.out.println("谁的年纪是12岁啊?");
System.out.println(handler1.handleMessage(12));
System.out.println("谁的年纪是13岁啊?");
System.out.println(handler1.handleMessage(13));
}
谁的年纪是12岁啊?
小红
谁的年纪是13岁啊?
No one
责任链模式十分简单。其减少了场景调用的耦合关系。请求者可以不用知道是谁处理的,只要知道结果即可。正如DNS的域名解析过程。
责任链过长的话,会给性能带来一定影响,同时使得调试变得复杂。