概述
設(shè)計(jì)模式是一些被反復(fù)使用的、具有普遍性的設(shè)計(jì)解決方案,它們是在特定情境下對(duì)軟件設(shè)計(jì)問(wèn)題的成功解決方式的總結(jié)和歸納。常見(jiàn)的設(shè)計(jì)模式可以分為以下三類:
創(chuàng)建型模式:這些模式用于處理對(duì)象的創(chuàng)建過(guò)程,包括工廠模式、抽象工廠模式、單例模式、建造者模式和原型模式。
結(jié)構(gòu)型模式:這些模式用于處理對(duì)象之間的組合,包括適配器模式、橋接模式、組合模式、裝飾模式、外觀模式、享元模式和代理模式。
行為型模式:這些模式用于處理對(duì)象之間的交互,包括責(zé)任鏈模式、命令模式、解釋器模式、迭代器模式、中介者模式、備忘錄模式、觀察者模式、狀態(tài)模式、策略模式、模板方法模式和訪問(wèn)者模式。
這些設(shè)計(jì)模式提供了在軟件設(shè)計(jì)中常用的一些解決方案,幫助開(kāi)發(fā)人員更加高效地進(jìn)行設(shè)計(jì)和開(kāi)發(fā)。同時(shí),這些模式還提高了代碼的可維護(hù)性和可擴(kuò)展性。
責(zé)任鏈模式
責(zé)任鏈模式(Chain of Responsibility Pattern)是一種行為型設(shè)計(jì)模式,它可以將請(qǐng)求的發(fā)送者和接收者解耦,并且使得多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。責(zé)任鏈模式通常被用來(lái)處理復(fù)雜的請(qǐng)求處理流程,例如在一個(gè)大型系統(tǒng)中,一個(gè)請(qǐng)求可能需要經(jīng)過(guò)多個(gè)處理器才能最終被處理。
一、應(yīng)用場(chǎng)景
責(zé)任鏈模式通常適用于以下情況:
當(dāng)有多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,并且它們需要按照一定的順序處理請(qǐng)求時(shí),可以使用責(zé)任鏈模式。
當(dāng)需要?jiǎng)討B(tài)地添加或刪除請(qǐng)求處理對(duì)象時(shí),可以使用責(zé)任鏈模式。
當(dāng)需要將請(qǐng)求處理對(duì)象從主體中分離出來(lái)時(shí),可以使用責(zé)任鏈模式。
典型應(yīng)用場(chǎng)景如下:
Web 應(yīng)用程序中的過(guò)濾器:Web 應(yīng)用程序中經(jīng)常使用過(guò)濾器,來(lái)對(duì)請(qǐng)求進(jìn)行預(yù)處理或后處理。使用責(zé)任鏈模式可以動(dòng)態(tài)地將過(guò)濾器添加到鏈中,從而實(shí)現(xiàn)對(duì)請(qǐng)求的預(yù)處理或后處理。
日志記錄:日志記錄是一種典型的責(zé)任鏈模式。在日志記錄中,日志記錄器通常會(huì)根據(jù)日志級(jí)別將日志分成不同的等級(jí),并將日志發(fā)送到相應(yīng)的處理器進(jìn)行處理。
異常處理:在程序中,可能會(huì)發(fā)生各種異常情況,如空指針異常、數(shù)組越界異常等。使用責(zé)任鏈模式可以將不同類型的異常處理器組成一個(gè)鏈,從而依次處理異常,并在鏈的末尾將異常記錄到日志中。
消息處理:在消息隊(duì)列中,可能會(huì)有多個(gè)消息處理器,用于處理不同類型的消息。使用責(zé)任鏈模式可以將這些消息處理器組成一個(gè)鏈,從而依次處理消息,并將消息傳遞給下一個(gè)處理器。
二、實(shí)現(xiàn)方式
責(zé)任鏈模式通常由以下角色組成:
抽象處理器(Handler):定義了一個(gè)處理請(qǐng)求的接口,并且保持了一個(gè)對(duì)下一個(gè)處理器的引用。
具體處理器(ConcreteHandler):實(shí)現(xiàn)了抽象處理器的接口,處理請(qǐng)求的同時(shí),也能夠決定是否將請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)處理器。
客戶端(Client):創(chuàng)建責(zé)任鏈,并將請(qǐng)求發(fā)送給第一個(gè)處理器。
三、代碼示例
下面是一個(gè)使用責(zé)任鏈模式的示例,假設(shè)有一個(gè)業(yè)務(wù)流程,需要依次經(jīng)過(guò)三個(gè)處理器才能完成。如果某個(gè)處理器無(wú)法處理請(qǐng)求,它將請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)處理器,直到請(qǐng)求被處理完成。
上述示例中,Handler 是抽象處理器,定義了處理請(qǐng)求的接口,并保持了一個(gè)對(duì)下一個(gè)處理器的引用。ConcreteHandler1、ConcreteHandler2 和 ConcreteHandler3 是具體處理器,實(shí)現(xiàn)了抽象處理器的接口,并能夠處理請(qǐng)求,并決定是否將請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)處理器。Client是客戶端,創(chuàng)建了責(zé)任鏈,并將請(qǐng)求發(fā)送給第一個(gè)處理器。
運(yùn)行該示例,將會(huì)輸出如下內(nèi)容:
ConcreteHandler1 is handling the request.ConcreteHandler2 is handling the request.ConcreteHandler3 is handling the request.No handler is available.
四、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
可以將請(qǐng)求的發(fā)送者和接收者解耦,并且使得多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。
可以動(dòng)態(tài)地添加或刪除請(qǐng)求處理對(duì)象,從而增加或減少請(qǐng)求處理的靈活性。
可以將請(qǐng)求處理對(duì)象從主體中分離出來(lái),從而簡(jiǎn)化了主體的代碼。
缺點(diǎn):
如果責(zé)任鏈太長(zhǎng),可能會(huì)導(dǎo)致請(qǐng)求的處理時(shí)間過(guò)長(zhǎng),從而影響系統(tǒng)性能。
如果責(zé)任鏈的配置不當(dāng),可能會(huì)導(dǎo)致請(qǐng)求不能被正確處理。
五、總結(jié)
責(zé)任鏈模式是一種行為型設(shè)計(jì)模式,它可以將請(qǐng)求的發(fā)送者和接收者解耦,并且使得多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求。責(zé)任鏈模式適用于多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,并且需要按照一定的順序處理請(qǐng)求的情況。使用責(zé)任鏈模式可以動(dòng)態(tài)地添加或刪除請(qǐng)求處理對(duì)象,從而增加或減少請(qǐng)求處理的靈活性,但如果責(zé)任鏈太長(zhǎng),可能會(huì)導(dǎo)致請(qǐng)求的處理時(shí)間過(guò)長(zhǎng),從而影響系統(tǒng)性能。
審核編輯:劉清
-
處理器
+關(guān)注
關(guān)注
68文章
19329瀏覽量
230141 -
接收機(jī)
+關(guān)注
關(guān)注
8文章
1182瀏覽量
53516 -
過(guò)濾器
+關(guān)注
關(guān)注
1文章
430瀏覽量
19641 -
迭代器
+關(guān)注
關(guān)注
0文章
43瀏覽量
4328
原文標(biāo)題:設(shè)計(jì)模式之責(zé)任鏈模式
文章出處:【微信號(hào):LabVIEW QT 修煉之路,微信公眾號(hào):LabVIEW QT 修煉之路】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
CKS32F4xx系列MCU的低功耗模式之睡眠模式
![CKS32F4xx系列MCU的低功耗<b class='flag-5'>模式</b><b class='flag-5'>之</b>睡眠<b class='flag-5'>模式</b>](https://file1.elecfans.com/web2/M00/8B/6B/wKgaomSY8kCAKDJ7AABYMDSOazU095.png)
電機(jī)控制之常用算法概述(3)
什么是設(shè)計(jì)模式?為什么要學(xué)習(xí)設(shè)計(jì)模式
C語(yǔ)言設(shè)計(jì)模式的程序資料合集
嵌入式軟件設(shè)計(jì)之設(shè)計(jì)模式
![嵌入式軟件設(shè)計(jì)<b class='flag-5'>之</b>設(shè)計(jì)<b class='flag-5'>模式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32低功耗模式之待機(jī)模式
![STM32低功耗<b class='flag-5'>模式</b><b class='flag-5'>之</b>待機(jī)<b class='flag-5'>模式</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
一起看看責(zé)任鏈設(shè)計(jì)模式吧!
什么是責(zé)任鏈?
如何用責(zé)任鏈默認(rèn)優(yōu)雅地進(jìn)行參數(shù)校驗(yàn)
責(zé)任鏈設(shè)計(jì)模式詳解
![<b class='flag-5'>責(zé)任</b><b class='flag-5'>鏈</b>設(shè)計(jì)<b class='flag-5'>模式</b>詳解](https://file1.elecfans.com/web2/M00/88/84/wKgaomRrFdiAUxthAAAakTFogrA916.png)
內(nèi)部補(bǔ)償高級(jí)電流模式(ACM)概述
![內(nèi)部補(bǔ)償高級(jí)電流<b class='flag-5'>模式</b>(ACM)<b class='flag-5'>概述</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
還在自己實(shí)現(xiàn)責(zé)任鏈?我建議你造輪子之前先看看這個(gè)開(kāi)源項(xiàng)目
![還在自己實(shí)現(xiàn)<b class='flag-5'>責(zé)任</b><b class='flag-5'>鏈</b>?我建議你造輪子之前先看看這個(gè)開(kāi)源項(xiàng)目](https://file1.elecfans.com//web2/M00/07/FF/wKgaombtGFuAFlFjAAMfA3tGG9c190.png)
評(píng)論