责任链模式,使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系。 将这些对象连成一条链, 并沿着这条链传递该请求, 直到有对象处理它为止。
在责任链模式中一个请求发送到链中后, 前一节点消费部分消息, 然后交由后续
节点继续处理。
实例代码:
// 处理等级
public class Level {
}
// 请求类
public class Request {
public Level getRequestLevel(){
// 请求的处理等级
return null;
}
}
// 响应类
public class Response {
}
// 抽象处理者
public abstract class Handler {
// 下一个处理者
private Handler nextHandler;
// 处理流程及分发
public final Response handlerMessage(Request request){
Response response = null;
// 判断处理级别
if(this.getHandlerLever().equals(request.getRequestLevel())){
// 自己的处理级别直接自己处理
response = this.echo(request);
}else{
// 不是自己的处理级别,需要判断后续是否有处理者
if(this.nextHandler != null){
response = this.nextHandler.handlerMessage(request);
}else{
// 没有后续处理者,需自行处理
}
}
return response;
}
// 指定下一个处理者
public void setNext(Handler handler){
this.nextHandler = handler;
}
// 处理者自身的处理等级
protected abstract Level getHandlerLever();
// 处理者的业务处理方法
protected abstract Response echo(Request request);
}
// 处理者1
public class ConcreteHandler1 extends Handler{
@Override
protected Level getHandlerLever() {
// 自身的处理等级
return null;
}
@Override
protected Response echo(Request request) {
// 自身的处理方法
return null;
}
}
// 处理者2
public class ConcreteHandler2 extends Handler{
@Override
protected Level getHandlerLever() {
// 自身的处理等级
return null;
}
@Override
protected Response echo(Request request) {
// 自身的处理方法
return null;
}
}
// 处理者3
public class ConcreteHandler3 extends Handler{
@Override
protected Level getHandlerLever() {
// 自身的处理等级
return null;
}
@Override
protected Response echo(Request request) {
// 自身的处理方法
return null;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
// 三个处理者
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
// 安排三个处理者的职责顺序
handler1.setNext(handler2);
handler2.setNext(handler3);
// 第一个处理者处理
Response response = handler1.handlerMessage(new Request());
}
}
责任链模式非常显著的优点是将请求和处理分开。 请求者可以不用知道是谁处理的, 处理者可以不用知道请求的全貌,两者解耦, 提高系统的灵活性。