Java責(zé)任鏈模式的實(shí)現(xiàn)方法詳解
一、責(zé)任鏈模式概述
責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計(jì)模式,它允許你將請(qǐng)求沿著處理鏈傳遞,直到有一個(gè)處理者能夠處理它為止。這種模式解耦了請(qǐng)求的發(fā)送者和接收者,使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求。
核心特點(diǎn)
- 解耦請(qǐng)求與處理:發(fā)送者不需要知道具體由哪個(gè)處理者處理請(qǐng)求
- 動(dòng)態(tài)組合:可以動(dòng)態(tài)地改變處理鏈
- 靈活性:可以靈活地新增或修改處理流程
- 多重處理:一個(gè)請(qǐng)求可以被多個(gè)處理者處理
二、責(zé)任鏈模式的結(jié)構(gòu)
主要角色
- Handler:抽象處理者,定義處理請(qǐng)求的接口
- ConcreteHandler:具體處理者,實(shí)現(xiàn)處理邏輯
- Client:客戶端,創(chuàng)建處理鏈并提交請(qǐng)求
三、責(zé)任鏈模式的實(shí)現(xiàn)
1. 基本實(shí)現(xiàn)
// 抽象處理者
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處理請(qǐng)求: " + 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處理請(qǐng)求: " + request.getContent());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 請(qǐng)求對(duì)象
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", "測(cè)試請(qǐng)求");
h1.handleRequest(request);
2. 更靈活的實(shí)現(xiàn)(帶中斷)
public interface Handler {
boolean handle(Request request);
}
public class AuthHandler implements Handler {
public boolean handle(Request request) {
if (!request.isAuthenticated()) {
System.out.println("認(rèn)證失敗");
return false;
}
System.out.println("認(rèn)證通過(guò)");
return true;
}
}
public class LoggingHandler implements Handler {
public boolean handle(Request request) {
System.out.println("記錄請(qǐng)求日志: " + request);
return true;
}
}
public class ProcessingHandler implements Handler {
public boolean handle(Request request) {
System.out.println("處理業(yè)務(wù)請(qǐng)求: " + 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);
四、責(zé)任鏈模式的應(yīng)用場(chǎng)景
1. Web請(qǐng)求過(guò)濾器
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("認(rèn)證通過(guò)");
chain.doFilter(request, response);
}
}
public class LoggingFilter implements Filter {
public void doFilter(HttpRequest request, HttpResponse response, FilterChain chain) {
System.out.println("請(qǐng)求日志: " + 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. 審批流程系統(tǒng)
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 + "審批采購(gòu)單: " + 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 + "審批采購(gòu)單: " + request);
} else if (successor != null) {
successor.processRequest(request);
}
}
}
// 使用示例
Approver zhangsan = new DepartmentHead("張三");
Approver lisi = new VicePresident("李四");
zhangsan.setSuccessor(lisi);
PurchaseRequest request = new PurchaseRequest(8000, "購(gòu)買設(shè)備");
zhangsan.processRequest(request);
3. 異常處理系統(tǒng)
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("默認(rèn)異常處理");
}
}
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);
}
}
}
五、責(zé)任鏈模式的變體
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. 中斷式責(zé)任鏈
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);
}
六、責(zé)任鏈模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 降低耦合度:請(qǐng)求發(fā)送者與接收者解耦
- 增強(qiáng)靈活性:可以動(dòng)態(tài)調(diào)整處理鏈
- 簡(jiǎn)化對(duì)象:每個(gè)處理者只需關(guān)注自己的責(zé)任范圍
- 易于擴(kuò)展:新增處理者不影響現(xiàn)有代碼
缺點(diǎn)
- 請(qǐng)求可能未被處理:如果沒(méi)有處理者能處理請(qǐng)求
- 性能影響:較長(zhǎng)的處理鏈可能影響性能
- 調(diào)試?yán)щy:請(qǐng)求的傳遞過(guò)程可能不易追蹤
七、最佳實(shí)踐
- 明確處理范圍:每個(gè)處理者應(yīng)明確自己的處理范圍
- 控制鏈的長(zhǎng)度:避免過(guò)長(zhǎng)的處理鏈影響性能
- 提供默認(rèn)處理:確保請(qǐng)求最終能被處理
- 日志記錄:記錄請(qǐng)求在鏈中的傳遞過(guò)程
- 考慮中斷機(jī)制:允許在處理過(guò)程中中斷傳遞
八、總結(jié)
責(zé)任鏈模式是處理復(fù)雜流程的有效方案,特別適用于:
- 有多個(gè)對(duì)象可以處理同一請(qǐng)求
- 需要?jiǎng)討B(tài)指定處理流程
- 需要解耦請(qǐng)求發(fā)送者和接收者
- 處理流程可能變化的情況
在實(shí)際開(kāi)發(fā)中,責(zé)任鏈模式常見(jiàn)于:
- Web框架的過(guò)濾器鏈
- 審批工作流系統(tǒng)
- 異常處理系統(tǒng)
- 事件處理管道
- 中間件設(shè)計(jì)
正確使用責(zé)任鏈模式可以提高系統(tǒng)的靈活性和可擴(kuò)展性,但需要注意控制處理鏈的復(fù)雜度,避免性能問(wèn)題。
到此這篇關(guān)于Java責(zé)任鏈模式實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java責(zé)任鏈模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java設(shè)計(jì)模式之責(zé)任鏈模式(Chain of Responsibility模式)介紹
- Java 中責(zé)任鏈模式實(shí)現(xiàn)的三種方式
- 詳解Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
- Java責(zé)任鏈模式詳解
- JAVA設(shè)計(jì)模式之責(zé)任鏈模式詳解
- Java設(shè)計(jì)模式之責(zé)任鏈模式簡(jiǎn)介
- java設(shè)計(jì)模式(實(shí)戰(zhàn))-責(zé)任鏈模式
- Java責(zé)任鏈模式定義與用法分析
- Java責(zé)任鏈設(shè)計(jì)模式
- Java實(shí)現(xiàn)設(shè)計(jì)模式之責(zé)任鏈模式
相關(guān)文章
Maven中Junit測(cè)試@Test等注解無(wú)法識(shí)別的問(wèn)題及解決
這篇文章主要介紹了Maven中Junit測(cè)試@Test等注解無(wú)法識(shí)別的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring依賴注入多種類型數(shù)據(jù)的示例代碼
這篇文章主要介紹了Spring依賴注入多種類型數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
JavaWeb 使用Session實(shí)現(xiàn)一次性驗(yàn)證碼功能
這篇文章主要介紹了JavaWeb 使用Session實(shí)現(xiàn)一次性驗(yàn)證碼功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
springboot yml配置文件定義list集合、數(shù)組和map以及使用中的錯(cuò)誤
這篇文章主要介紹了springboot yml配置文件定義list集合、數(shù)組和map以及使用中遇到的錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Java實(shí)現(xiàn)簡(jiǎn)單畫(huà)畫(huà)畫(huà)板
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單畫(huà)畫(huà)畫(huà)板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06

