责任链模式应用于多个对象可以处理同一个请求的情况,为了简化客户端的调用,客户端只需将一个请求提交到处理对象中(简化客户端后调用后,客户端并不知道该把请求转发到哪个对象中),处理对象会自动寻找一些列的对象处理该对象,若对象的请求成功处理,那么请求转发就终止,否则,一直往下传递请求。
其实这个应用场景在日常生活中很常见,比如找领导签字,下面是一个简单的找领导签字的demo,注释都写好了,比较简单
结构图如下:
程序代码如下:
package net.liuyx.test;
public class ChainOfResponsiblityTest {
public static void main(String[] args) {
SignHandler handler = new DeskClerk();//老百姓去找领导签字,首先去见的是一些小喽啰,比如这里的接待员
Signature signature = Signature.Normal;//老百姓带了个签字难度适中的文件,不知道该给谁,但肯定的是在这个局里能得到最终结果
handler.sign(signature);//这个局里的相关人员处理这个签名
}
}
/**
* 这里的签名其实像盖章,关键是要拿到领导的章,章会自动把字印出来的,领导那鬼字谁稀罕!
* @author liuyx
*
*/
enum Signature {
Simple {
void print() {
System.out.println("哦,这个签字程序很简单");
}
},
Normal {
void print() {
System.out.println("哈,这个签名程序难度一般");
}
},
Hard {
void print() {
System.out.println("额,这个签名程序比较复杂");
}
};
abstract void print();
}
abstract class SignHandler {
SignHandler nextSignHandler;
abstract boolean sign(Signature signature);
public SignHandler getNextHandler() {
return nextSignHandler;
}
public void setNextHandler(SignHandler handler) {
nextSignHandler = handler;
}
}
/**
* 前台接待员
* @author user
*
*/
class DeskClerk extends SignHandler {
private static final Signature signatureState = Signature.Simple;
@Override
boolean sign(Signature signature) {
if (signature.equals(this.signatureState)) {
signature.print();
System.out.println("接待员签字就可以了");
return true;
}
setNextHandler(new Chief());
getNextHandler().sign(signature);
return false;
}
}
/**
* 处长
* @author user
*
*/
class Chief extends SignHandler {
private static final Signature signatureState = Signature.Normal;
@Override
boolean sign(Signature signature) {
if (signature.equals(this.signatureState)) {
signature.print();
System.out.println("处长签字就可以了");
return true;
}
setNextHandler(new Head());
getNextHandler().sign(signature);
return false;
}
}
/**
* 最终领导,局长
* @author user
*
*/
class Head extends SignHandler {
private static final Signature signatureState = Signature.Hard;
@Override
boolean sign(Signature signature) {
if (signature.equals(this.signatureState)) {
signature.print();
System.out.println("局长签字了");
return true;
}
System.out.println("对不起,你找错地方签字了,这个章我们这边盖不了");
return false;
}
}
程序输出为:
很多框架中的事件处理其实用的也是责任链模式,用户点击某个UI事件,该事件所在的UI就处理该事件,若处理不了,则一直上浮事件