title: 责任链模式
author: rack-leen
avatar: /images/favicon.png
authorDesc: 脱发典范
comments: true
copyright: true
date: 2019-5-19 22:12:56
tags:
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
package org.example.chain;
/**
* 抽象处理器,所有的处理器实体都要集成这个处理器
*/
public abstract class Handler {
/**
* 处理器需要处理的请求等级
*/
public final static int GET_REQUEST = 0 ;
public final static int POST_REQUEST = 1 ;
public final static int OTHER_REQUEST = 2 ;
private int handlerCount = 0 ;
/**
* 成员变量
*/
private Handler nextHandler ;
private int level ;
/**
* 处理器用来初始化输入请求的等级
* @param level
*/
public Handler(int level){
this.level = level ;
}
/**
* 处理器处理请求的业务逻辑
* @param request
*/
public void handlerMessage(Request request){
// 如果请求等级相同
if (this.level == request.getType()){
this.response(request); // 那么就使用当前处理器
}else {
// 如果还有下一个处理器,就将请求交给下一个处理器处理
if (nextHandler != null){
this.nextHandler.handlerMessage(request); // 使用下一个处理器
}else { // 如果没有处理器了,就不处理该请求
System.out.println("没有适合的处理器处理请求。");
}
}
}
/**
* 将各个处理器连接起来,形成一个责任链条
* @param handler
*/
public void setNextHandler(Handler handler){
if (handlerCount < 5){
this.nextHandler = handler ;
handlerCount++ ;
}else {
System.out.println("责任链条超出阈值");
}
}
/**
* 处理器响应请求
* @param request
*/
protected abstract void response(Request request);
}
package org.example.chain;
/**
* get请求的处理器
*/
public class GetHandler extends Handler {
/**
* 初始化get请求的等级
*/
public GetHandler(){
super(Handler.GET_REQUEST);
}
// 表示获取的请求是一个get请求
@Override
protected void response(Request request) {
System.out.println("开始处理GET请求:"+request.getRequest());
}
}
package org.example.chain;
/**
*
*/
public class PostHandler extends Handler {
/**
* 初始化post请求的等级
*/
public PostHandler(){
super(Handler.POST_REQUEST);
}
/**
* 处理器响应post请求
* @param request
*/
@Override
protected void response(Request request) {
System.out.println("开始处理POST请求:"+request.getRequest());
}
}
package org.example.chain;
public class OtherHandler extends Handler {
public OtherHandler(){
super(Handler.OTHER_REQUEST);
}
@Override
protected void response(Request request) {
System.out.println("开始处理其他请求:"+request.getRequest());
}
}
package org.example.chain;
/**
* 请求角色,为请求设置等级,用来匹配责任链中的处理器
*/
public class Request {
private int type ;
private String request ;
/**
* type = 0 表示是GET请求
* type = 1 表示是POST请求
*/
public Request(int type , String request){
this.type = type ;
switch (type){
case 0 :
this.request = request+"是一个GET请求";
break;
case 1 :
this.request = request+"是一个POST请求";
break;
case 2 :
this.request = request+"是一个未知请求";
break;
}
}
public int getType(){
return this.type ;
}
public String getRequest(){
return this.request ;
}
}
public class App {
/**
* 责任链模式
* @param args
*/
public static void main(String[] args) {
// 先创建一个get请求
Request request = new Request(0 , "http://example.com/get?a=b");
// 创建一个post请求
Request request1 = new Request(1, "http://example.com/post");
Request request2 = new Request(2, "http://example.com/other");
// 创建责任链节点
GetHandler getHandler = new GetHandler();
PostHandler postHandler = new PostHandler();
OtherHandler otherHandler = new OtherHandler();
// 将责任链的各个节点连接起来,形成一个链条
getHandler.setNextHandler(postHandler);
postHandler.setNextHandler(otherHandler);
// 请求开始通过责任链进行判断
getHandler.handlerMessage(request);
getHandler.handlerMessage(request1);
getHandler.handlerMessage(request2);
}
}