軟件設(shè)計(jì)模式(Design pattern),又稱設(shè)計(jì)模式,是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。
匯總目錄鏈接:【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】學(xué)習(xí)目錄匯總整理
一、簡介
??責(zé)任鏈模式(Chain of Responsibility),一種行為型設(shè)計(jì)模式,它為請求創(chuàng)建了一個(gè)接收者對象的鏈。這種模式給予了請求的處理更多的靈活性,可以動態(tài)地決定請求由哪個(gè)對象來處理。實(shí)際上,每個(gè)接收者對象都包含對另一個(gè)接收者對象的引用,如果當(dāng)前對象無法處理請求,它會將請求傳遞給下一個(gè)接收者對象。
主要角色:
- 抽象處理器(Handler):處理器接口定義了處理請求的方法,通常會有一個(gè)處理請求的方法和設(shè)置下一個(gè)處理器的方法。
- 具體處理器(ConcreteHandler):具體處理器實(shí)現(xiàn)處理器接口,處理請求或?qū)⒄埱髠鬟f給鏈上的下一個(gè)處理器。
- 客戶端(Client):客戶端負(fù)責(zé)構(gòu)建處理器鏈,并向鏈上的第一個(gè)處理器發(fā)送請求。
二、實(shí)例
例如:員工請假,請假2天內(nèi),經(jīng)理審批;超過2天,不大于5天,總監(jiān)審批;超過5天,CTO審批。文章來源:http://www.zghlxwxcb.cn/news/detail-641869.html
1、請假類(LeaveRequest)
public class LeaveRequest {
private int days;
public LeaveRequest(int days) {
this.days = days;
}
public int getDays() {
return days;
}
}
2、處理器接口(LeaveRequestHandler)
public interface LeaveRequestHandler {
void setNextHandler(LeaveRequestHandler nextHandler);
void handleRequest(LeaveRequest request);
}
3、經(jīng)理處理器(Manager)
@Slf4j
public class Manager implements LeaveRequestHandler {
private LeaveRequestHandler nextHandler;
@Override
public void setNextHandler(LeaveRequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getDays() <= 2) {
log.info("審批流程處理 -> 經(jīng)理");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
4、總監(jiān)處理器(Commissioner)
@Slf4j
public class Commissioner implements LeaveRequestHandler {
private LeaveRequestHandler nextHandler;
@Override
public void setNextHandler(LeaveRequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getDays() <= 5) {
log.info("審批流程處理 -> 總監(jiān)");
} else {
nextHandler.handleRequest(request);
}
}
}
5、CTO處理器(CTO)
@Slf4j
public class CTO implements LeaveRequestHandler {
private LeaveRequestHandler nextHandler;
@Override
public void setNextHandler(LeaveRequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
@Override
public void handleRequest(LeaveRequest request) {
if (request.getDays() > 5) {
log.info("審批流程處理 -> CTO");
} else {
log.info("沒有流程節(jié)點(diǎn)");
}
}
}
6、客戶端(Client)
@Slf4j
public class Client {
public static void main(String[] args) {
LeaveRequestHandler manager = new Manager();
LeaveRequestHandler commissioner = new Commissioner();
LeaveRequestHandler cto = new CTO();
manager.setNextHandler(commissioner);
commissioner.setNextHandler(cto);
log.info("請假10天");
LeaveRequest request = new LeaveRequest(10);
manager.handleRequest(request);
}
}
輸出控制臺:文章來源地址http://www.zghlxwxcb.cn/news/detail-641869.html
請假10天
審批流程處理 -> CTO
三、總結(jié)
1、優(yōu)點(diǎn)
- 降低耦合度。將請求的發(fā)送者和接收者解耦。
- 簡化對象。對象不需要知道鏈的結(jié)構(gòu)。
- 增加新的請求處理類很方便。
- 增強(qiáng)給對象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動它們的次序,允許動態(tài)地新增或者刪除責(zé)任。
2、缺點(diǎn)
- 不能保證請求一定被接收。
- 對比較長的職責(zé)鏈,系統(tǒng)性能將受到一定影響。而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會造成循環(huán)調(diào)用。
3、應(yīng)用場景
- 有多個(gè)對象可以處理同一個(gè)請求,具體哪個(gè)對象處理該請求由運(yùn)行時(shí)刻自動確定。
- 在不明確指定接收者的情況下,向多個(gè)對象中的一個(gè)提交一個(gè)請求。
- 可動態(tài)指定一組對象處理請求。
到了這里,關(guān)于【玩轉(zhuǎn)23種Java設(shè)計(jì)模式】行為型模式篇:責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!