责任链模式定义
避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
责任链模式结构图
责任链模式角色介绍
抽象处理者,Handler,一个为抽象类,它定义了一个处理请求的接口;同时它会持有一个抽象处理者类型的成员变量,表示请求链路的下一个处理者。
具体处理者,ConcreteHandler,它是抽象处理者的子类,处理用户请求,以及转发请求给后继者;在具体处理者中可以访问链中下一个对象,以便请求的转发。
责任链模式结构代码
抽象处理者:
public abstract class Handler {
protected Handler nextHandler;
public Handler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract String handlerRequest(int num);
}
具体处理者1:
public class ConcreteHandler1 extends Handler {
public ConcreteHandler1(Handler nextHandler) {
super(nextHandler);
}
public String handlerRequest(int num) {
if (num<10){
return "小于10";
}else {
if (nextHandler==null){
return "没有下一处理者";
}
return nextHandler.handlerRequest(num);
}
}
}
具体处理者2:
public class ConcreteHandler2 extends Handler {
public ConcreteHandler2(Handler nextHandler) {
super(nextHandler);
}
public String handlerRequest(int num) {
if (num>20){
return "小于10";
}else {
if (nextHandler==null){
return "没有下一处理者";
}
return nextHandler.handlerRequest(num);
}
}
}
客户端:
public class Client {
public static void main(String[] args) {
Handler handler = new ConcreteHandler1(new ConcreteHandler2(null));
String result = handler.handlerRequest(1);
System.out.println("result = " + result);
}
}
责任链模式运行机制
责任链模式,每个具体处理者类持有一个抽象处理者类型的成员变量,表示下一个处理者;每一个处理者都会选择性处理自己应该处理的业务逻辑,然后再将请求传递给下一个处理者;依次就形成了一个处理链条。
责任链模式解决的核心问题
责任链模式将请求和处理进行解耦,请求者可以不知道具体的处理者,处理者也不知道请求的全貌,两者解耦,提高系统的灵活性。
责任链模式扩展
上面所述的责任链模式,我给它划分为私有链模式,也叫手拉手模式,也就是各个具体处理者类都会持有下一个处理者对象,处理者之间就像手拉手一样,实现请求的处理和传递。
除了这种私有链模式,还有一种公有链模式,每个具体处理者类不负责持有下一个具体处理者对象,而是将其交给一个专门的类进行管理,这个专门的类就是公有链类。
责任链模式扩展-公有链模式结构图
责任链模式之公有链模式增加的角色
公有链角色,HandlerChain,负责持有所有具体处理者对象,并负责维护、操作由具体处理者形成的链。
责任链模式之公有链模式结构代码
抽象处理者:
public abstract class Handler {
public abstract String handlerRequest(int num,HandlerChain chain);
}
具体处理者1:
public class ConcreteHandler1 extends Handler {
public String handlerRequest(int num,HandlerChain chain) {
if (num<10){
return "小于10";
}else {
return chain.doHandlerChain(num);
}
}
}
具体处理者2:
public class ConcreteHandler2 extends Handler {
public String handlerRequest(int num,HandlerChain chain) {
if (num>20){
return "小于10";
}else {
return chain.doHandlerChain(num);
}
}
}
公有链:
public class HandlerChain {
private final List<Handler> handlers = new ArrayList<Handler>();
private int index = 0;
public void addHandler(Handler handler){
handlers.add(handler);
}
public String doHandlerChain(int num){
Handler handler = handlers.get(index);
if (handler == null){
return "没有下一处理者";
}
++index;
return handler.handlerRequest(num,this);
}
}
客户端:
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
HandlerChain chain = new HandlerChain();
chain.addHandler(handler1);
chain.addHandler(handler2);
String result = chain.doHandlerChain(1);
System.out.println("result = " + result);
}
}
责任链模式之公有链模式运行机制
抽出一个单独的类HandlerChain作为处理者的维护者和操作者;
它负责持有处理者,并将它们按顺序组装成链,这个链就是公有链;
客户端通过chain启动对处理者们的调用;
各个处理者处理完自己负责的业务逻辑之后,再将请求传递给chain,chain按链式顺序继续操作下一个处理者。
私有链和公有链对比
私有链结构简单,但每一个处理者都要维护下一个处理者,前后存在耦合,业务请求链变更比较麻烦;
公有链结构复杂,需要单独类来维护请求链,但各个处理者无需维护下一处理者,只关心自己就好,请求流转都交给公有链处理,业务链比较清晰,也更具有灵活性。
两者要结合实际业务情况,选择适当的模式结构。