責(zé)任鏈模式是將請求和處理進(jìn)行分離跳纳,處理請求的對象可由多個(gè)節(jié)點(diǎn)完成小压,多個(gè)節(jié)點(diǎn)連接成一條鏈锻梳,當(dāng)某個(gè)節(jié)點(diǎn)處理不了請求時(shí)就會(huì)將請求傳遞給下個(gè)節(jié)點(diǎn)去處理俏橘,如果可以處理就直接結(jié)束。主要涉及3個(gè)角色:
- 抽象責(zé)任鏈節(jié)點(diǎn):是一個(gè)抽象類井联,包含下個(gè)節(jié)點(diǎn)的引用和處理請求的抽象方法卜壕。
- 具體實(shí)現(xiàn)節(jié)點(diǎn):抽象責(zé)任鏈節(jié)點(diǎn)的具體實(shí)現(xiàn),實(shí)現(xiàn)處理請求的具體業(yè)務(wù)邏輯烙常。
- 客戶端:構(gòu)建節(jié)點(diǎn)鏈條轴捎,發(fā)送請求,責(zé)任鏈?zhǔn)坠?jié)點(diǎn)開始處理請求蚕脏。
示例
已請假審批為例侦副,員工請假首先要到組長那去審批,一般請假天數(shù)<=3天組長可以審批驼鞭,如果請假天數(shù)<=5天總監(jiān)可以審批秦驯,請假天數(shù)<=7天得部長審批,超過了7天直接被駁回挣棕。對于組長译隘、總監(jiān)、部長可以構(gòu)建責(zé)任鏈洛心,請假審批可以視為處理請求固耘。
// 抽象責(zé)任鏈節(jié)點(diǎn)
public abstract class Handler {
// 下一個(gè)節(jié)點(diǎn)
private Handler nextHandler;
// 處理請求
protected abstract void handleRequest(int days);
public Handler getNextHandler() {
return nextHandler;
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
}
// 組長節(jié)點(diǎn)
public class PmHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 3) {
System.out.println("組長同意了請假審批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("請假天數(shù)太多被駁回!");
}
}
}
}
// 總監(jiān)節(jié)點(diǎn)
public class DirectorHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 5) {
System.out.println("總監(jiān)同意了請假審批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("請假天數(shù)太多被駁回!");
}
}
}
}
// 部長節(jié)點(diǎn)
public class MinistorHandler extends Handler {
@Override
protected void handleRequest(int days) {
if (days <= 7) {
System.out.println("部長同意了請假審批!");
} else {
if (getNextHandler() != null) {
getNextHandler().handleRequest(days);
} else {
System.out.println("請假天數(shù)太多被駁回!");
}
}
}
}
// 客戶端
public class Client {
public static void main(String[] args) {
Handler pmHandler = new PmHandler();
Handler directorHandler = new DirectorHandler();
Handler ministorHandler = new MinistorHandler();
// 構(gòu)建鏈條
pmHandler.setNextHandler(directorHandler);
directorHandler.setNextHandler(ministorHandler);
// 處理請假請求
pmHandler.handleRequest(2);
pmHandler.handleRequest(5);
pmHandler.handleRequest(7);
pmHandler.handleRequest(10);
}
}
運(yùn)行結(jié)果如下: