Chain of Responsibility(职责链)
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
结构图
在以下情况使用:
- 有多个对象可以处理一个请求,哪个对象处理该请求运行时自动确定。
- 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定
实现
职责链就是将多个处理对象串起来,可以是线性的,也可以是树型的。请求在链中传递直至遇到可以处理的对象为止,这是纯的职责链,即要么自身承担全部的处理,要么给下家处理。
还有不纯的职责链,即自身可以处理一部分,剩下的给下家处理。
Handle
public abstract class Handle {
private Handle next;
public Handle getNext() {
return next;
}
public void setNext(Handle next) {
this.next = next;
}
abstract void handleRequest(String request);
}
public class ConcreteHandle1 extends Handle {
@Override
void handleRequest(String request) {
if("1".equals(request)){
System.out.println("handle1处理");
}else {
if(getNext()==null){
System.out.println("没有handle处理");
}else {
getNext().handleRequest(request);
}
}
}
}
public class ConcreteHandle2 extends Handle {
@Override
void handleRequest(String request) {
if("2".equals(request)){
System.out.println("handle2处理");
}else {
if(getNext()==null){
System.out.println("没有handle处理");
}else {
getNext().handleRequest(request);
}
}
}
}
public class ConcreteHandle3 extends Handle {
@Override
void handleRequest(String request) {
if("3".equals(request)){
System.out.println("handle3处理");
}else {
if(getNext()==null){
System.out.println("没有handle处理");
}else {
getNext().handleRequest(request);
}
}
}
}
main
public class Mian {
public static void main(String[] args) {
Handle handle1 = new ConcreteHandle1();
Handle handle2 = new ConcreteHandle2();
Handle handle3 = new ConcreteHandle3();
handle1.setNext(handle2);
handle2.setNext(handle3);
handle1.handleRequest("2");
handle1.handleRequest("3");
handle1.handleRequest("4");
}
}
相关模式
职责链常和Composite一起使用。在这种情况下,一个构件的父构件可作为它的后继。