概念
职责链模式就是使多个对象都有机会处理请求,从而避免请求发送者和请求处理者之间的耦合。将这多个对象按着需求组合成一条链,使请求在这条链上进行传递,知道有一个对象处理了请求。
优点
1.客户提交的请求会沿着我们根据需求设置的链一直传递,直到有一个对象处理了它,并且我们可以根据需要随后的增加或者而修改链上的对象,而不影响每个对象本身的使用。
2.请求发送者和请求接受者之间没有耦合,互相都没有对方的信息,且链中的对象本身也不清楚链的结构
3.简化了的对象之间的相互连接,每个对象最多只保持一个后继者的引用,不用保持所有后继者的引用
注意:1.我们设置的链一定要保证最终这个请求可以被处理 2.需要在每个对象中做出判断,判断什么条件下我可以处理或者什么条件下交给继任者(当然要判断时候有继任者)
使用场景
一个请求可能被传递给多个对象,直到某个对象处理完成结束,但是客户并不知道请求会被那个对象处理。
代码示例
//定义一个处理请求的接口
public abstract class Handler { /** * 持有后继者的引用对象 */ protected Handler successor; /** * 处理请求的抽象方法 虽然这个示意方法是没有传入参数的 * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 */ public abstract void handleRequest(); /** * 取值方法 */ public Handler getSuccessor() { return successor; } /** * 赋值方法,设置后继的责任对象 */ public void setSuccessor(Handler successor) { this.successor = successor; } }
定义若干个具体处理者类
public class ConcreteHandler1 extends Handler { /** * 处理方法,调用此方法处理请求 */ @Override public void handleRequest() { /** * 判断是否有后继的责任对象 * 如果有,就转发请求给后继的责任对象 * 如果没有,则处理请求 */ if(什么条件下能处理这个请求){
System.out.println("处理请求");
}else if(successor!=null){
System.out.println("放过请求");
successor.handleRequest();
}
}
}
public class ConcreteHandler2 extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 判断是否有后继的责任对象
* 如果有,就转发请求给后继的责任对象
* 如果没有,则处理请求
*/
if(什么条件下能处理这个请求){
System.out.println("处理请求");
}else if(successor!=null){
System.out.println("放过请求"); successor.handleRequest();
}
}
}
......
客户端代码,向链上的具体处理者对象提交请求
public class Client { public static void main(String[] args) { //组装责任链 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); handler1.setSuccessor(handler2); //提交请求 handler1.handleRequest(); } }