版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29994609/article/details/52090522
意图:
- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
个人理解:
- 当一个方法里面有很多个大if…else if…else判断时,就可以使用责任链模式了。
适用性:
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
纯的与不纯的责任链模式
- 一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。
- 在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。
- 纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。
简单代码,便于理解:
/**
* 抽象责任链
*/
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 (getSuccessor() == null) {
System.out.println("处理请求");
} else {
System.out.println("放过请求");
getSuccessor().handleRequest();
}
}
}
/**
* 具体责任链
*/
public class ConcreteHandler2 extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 判断是否符合处理条件
* 如果符合,就处理当前请求
* 如果不符合,则转发给下一个责任链。
*/
if (getSuccessor() == null) {
System.out.println("处理请求");
} else {
System.out.println("放过请求");
getSuccessor().handleRequest();
}
}
}
/**
* 具体责任链
*/
public class ConcreteHandler3 extends Handler {
/**
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
/**
* 判断是否符合处理条件
* 如果符合,就处理当前请求
* 如果不符合,则转发给下一个责任链。
*/
if (getSuccessor() == null) {
System.out.println("处理请求");
} else {
System.out.println("放过请求");
getSuccessor().handleRequest();
}
}
}
/**
* 客户端类,完成责任链的组装与触发请求
*/
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handler3);
//提交请求
handler1.handleRequest();
}