一、责任链模式概述
责任链模式(chain of responsibility pattern)是一种行为型设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理它为止。这种模式解耦了请求的发送者和接收者,使多个对象都有机会处理请求。
核心特点
- 解耦请求与处理:发送者不需要知道具体由哪个处理者处理请求
- 动态组合:可以动态地改变处理链
- 灵活性:可以灵活地新增或修改处理流程
- 多重处理:一个请求可以被多个处理者处理
二、责任链模式的结构
主要角色
- handler:抽象处理者,定义处理请求的接口
- concretehandler:具体处理者,实现处理逻辑
- client:客户端,创建处理链并提交请求
三、责任链模式的实现
1. 基本实现
// 抽象处理者
public abstract class handler {
protected handler successor;
public void setsuccessor(handler successor) {
this.successor = successor;
}
public abstract void handlerequest(request request);
}
// 具体处理者a
public class concretehandlera extends handler {
public void handlerequest(request request) {
if (request.gettype().equals("typea")) {
system.out.println("handlera处理请求: " + request.getcontent());
} else if (successor != null) {
successor.handlerequest(request);
}
}
}
// 具体处理者b
public class concretehandlerb extends handler {
public void handlerequest(request request) {
if (request.gettype().equals("typeb")) {
system.out.println("handlerb处理请求: " + request.getcontent());
} else if (successor != null) {
successor.handlerequest(request);
}
}
}
// 请求对象
public class request {
private string type;
private string content;
public request(string type, string content) {
this.type = type;
this.content = content;
}
// getter方法
public string gettype() { return type; }
public string getcontent() { return content; }
}
// 使用示例
handler h1 = new concretehandlera();
handler h2 = new concretehandlerb();
h1.setsuccessor(h2);
request request = new request("typeb", "测试请求");
h1.handlerequest(request);
2. 更灵活的实现(带中断)
public interface handler {
boolean handle(request request);
}
public class authhandler implements handler {
public boolean handle(request request) {
if (!request.isauthenticated()) {
system.out.println("认证失败");
return false;
}
system.out.println("认证通过");
return true;
}
}
public class logginghandler implements handler {
public boolean handle(request request) {
system.out.println("记录请求日志: " + request);
return true;
}
}
public class processinghandler implements handler {
public boolean handle(request request) {
system.out.println("处理业务请求: " + request);
return true;
}
}
public class handlerchain {
private list<handler> handlers = new arraylist<>();
public handlerchain addhandler(handler handler) {
handlers.add(handler);
return this;
}
public boolean process(request request) {
for (handler handler : handlers) {
if (!handler.handle(request)) {
return false;
}
}
return true;
}
}
// 使用示例
handlerchain chain = new handlerchain()
.addhandler(new authhandler())
.addhandler(new logginghandler())
.addhandler(new processinghandler());
request request = new request("test");
chain.process(request);
四、责任链模式的应用场景
1. web请求过滤器
public interface filter {
void dofilter(httprequest request, httpresponse response, filterchain chain);
}
public class authenticationfilter implements filter {
public void dofilter(httprequest request, httpresponse response, filterchain chain) {
if (!request.isauthenticated()) {
response.setstatus(401);
return;
}
system.out.println("认证通过");
chain.dofilter(request, response);
}
}
public class loggingfilter implements filter {
public void dofilter(httprequest request, httpresponse response, filterchain chain) {
system.out.println("请求日志: " + request.getpath());
chain.dofilter(request, response);
}
}
public class filterchain {
private list<filter> filters = new arraylist<>();
private int index = 0;
public filterchain addfilter(filter filter) {
filters.add(filter);
return this;
}
public void dofilter(httprequest request, httpresponse response) {
if (index < filters.size()) {
filter filter = filters.get(index++);
filter.dofilter(request, response, this);
}
}
}
2. 审批流程系统
public abstract class approver {
protected approver successor;
protected string name;
public approver(string name) {
this.name = name;
}
public void setsuccessor(approver successor) {
this.successor = successor;
}
public abstract void processrequest(purchaserequest request);
}
public class departmenthead extends approver {
public departmenthead(string name) {
super(name);
}
public void processrequest(purchaserequest request) {
if (request.getamount() < 5000) {
system.out.println("部门主管" + name + "审批采购单: " + request);
} else if (successor != null) {
successor.processrequest(request);
}
}
}
public class vicepresident extends approver {
public vicepresident(string name) {
super(name);
}
public void processrequest(purchaserequest request) {
if (request.getamount() < 10000) {
system.out.println("副总裁" + name + "审批采购单: " + request);
} else if (successor != null) {
successor.processrequest(request);
}
}
}
// 使用示例
approver zhangsan = new departmenthead("张三");
approver lisi = new vicepresident("李四");
zhangsan.setsuccessor(lisi);
purchaserequest request = new purchaserequest(8000, "购买设备");
zhangsan.processrequest(request);
3. 异常处理系统
public interface exceptionhandler {
void handle(exception e, exceptionhandlerchain chain);
}
public class nullpointerhandler implements exceptionhandler {
public void handle(exception e, exceptionhandlerchain chain) {
if (e instanceof nullpointerexception) {
system.out.println("处理空指针异常");
} else {
chain.handle(e);
}
}
}
public class ioexceptionhandler implements exceptionhandler {
public void handle(exception e, exceptionhandlerchain chain) {
if (e instanceof ioexception) {
system.out.println("处理io异常");
} else {
chain.handle(e);
}
}
}
public class defaultexceptionhandler implements exceptionhandler {
public void handle(exception e, exceptionhandlerchain chain) {
system.out.println("默认异常处理");
}
}
public class exceptionhandlerchain {
private list<exceptionhandler> handlers = new arraylist<>();
private int index = 0;
public exceptionhandlerchain addhandler(exceptionhandler handler) {
handlers.add(handler);
return this;
}
public void handle(exception e) {
if (index < handlers.size()) {
exceptionhandler handler = handlers.get(index++);
handler.handle(e, this);
}
}
}
五、责任链模式的变体
1. 功能链模式
public interface function<t, r> {
r apply(t t, function<t, r> next);
}
public class functionchain<t, r> {
private list<function<t, r>> functions = new arraylist<>();
public functionchain<t, r> addfunction(function<t, r> function) {
functions.add(function);
return this;
}
public r execute(t input) {
if (functions.isempty()) return null;
function<t, r> first = functions.get(0);
return first.apply(input, (t, n) -> {
int nextindex = functions.indexof(n) + 1;
if (nextindex < functions.size()) {
return functions.get(nextindex).apply(t, functions.get(nextindex));
}
return null;
});
}
}
2. 中断式责任链
public abstract class interruptiblehandler {
private interruptiblehandler next;
public void setnext(interruptiblehandler next) {
this.next = next;
}
public final void handle(request request) {
if (!dohandle(request) && next != null) {
next.handle(request);
}
}
protected abstract boolean dohandle(request request);
}
六、责任链模式的优缺点
优点
- 降低耦合度:请求发送者与接收者解耦
- 增强灵活性:可以动态调整处理链
- 简化对象:每个处理者只需关注自己的责任范围
- 易于扩展:新增处理者不影响现有代码
缺点
- 请求可能未被处理:如果没有处理者能处理请求
- 性能影响:较长的处理链可能影响性能
- 调试困难:请求的传递过程可能不易追踪
七、最佳实践
- 明确处理范围:每个处理者应明确自己的处理范围
- 控制链的长度:避免过长的处理链影响性能
- 提供默认处理:确保请求最终能被处理
- 日志记录:记录请求在链中的传递过程
- 考虑中断机制:允许在处理过程中中断传递
八、总结
责任链模式是处理复杂流程的有效方案,特别适用于:
- 有多个对象可以处理同一请求
- 需要动态指定处理流程
- 需要解耦请求发送者和接收者
- 处理流程可能变化的情况
在实际开发中,责任链模式常见于:
- web框架的过滤器链
- 审批工作流系统
- 异常处理系统
- 事件处理管道
- 中间件设计
正确使用责任链模式可以提高系统的灵活性和可扩展性,但需要注意控制处理链的复杂度,避免性能问题。
到此这篇关于java责任链模式实现方法的文章就介绍到这了,更多相关java责任链模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论