最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS設(shè)計模式之責任鏈模式應(yīng)用詳解

 更新時間:2023年08月27日 09:37:53   作者:慕仲卿  
JS責任鏈模式是一種行為型設(shè)計模式,它允許多個對象按照順序處理請求,直到其中一個對象能夠處理請求為止,這樣的對象鏈被稱為責任鏈,本文將給大家詳細講講責任鏈模式在JS中的應(yīng)用,需要的朋友可以參考下

責任鏈模式(Chain of Responsibility Pattern)

定義:

一種行為型設(shè)計模式,它允許多個對象按照順序處理請求,直到其中一個對象能夠處理請求為止。這樣的對象鏈被稱為責任鏈。

特點:

  • 在責任鏈模式中,每個處理請求的對象都有一個對下一個對象的引用,形成一個鏈條。

  • 當客戶端發(fā)送請求時,請求會沿著鏈條傳遞,直到被某個處理器對象處理或者整個鏈條結(jié)束。

參與者:

  • 抽象處理器(Abstract Handler):定義了處理請求的接口和維護下一個處理器的引用。通常實現(xiàn)為抽象類或接口。

  • 具體處理器(Concrete Handler):具體實現(xiàn)了處理請求的方法。如果可以處理請求,則進行處理;否則將請求傳遞給下一個處理器。

工作流程:

  • 客戶端創(chuàng)建并初始化責任鏈中的處理器對象,并設(shè)置好它們的處理順序。

  • 當客戶端發(fā)送請求時,請求從鏈條的開頭開始傳遞。

  • 每個處理器檢查自己是否能夠處理請求,如果可以,則進行處理并停止傳遞;否則將請求傳遞給下一個處理器。(這個過程必然會用到if else)

  • 這個過程持續(xù)進行,直到請求被處理或者整個鏈條結(jié)束。

優(yōu)點:

  • 解耦發(fā)送者和接收者,使得請求的發(fā)送者不需要知道哪個對象會處理請求。

  • 可以動態(tài)地添加或修改處理器對象,從而避免將請求的處理邏輯硬編碼到單個對象中,增加了代碼的可維護性和可擴展性。

缺點:

  • 整個鏈條的長度可能會對性能產(chǎn)生影響,特別是在鏈條非常長時。

使用場景:

  • 處理者是動態(tài)的或者是不能預(yù)先確定的:有多個對象可以處理請求,但具體的處理者只在運行時確定

  • 希望將請求的發(fā)送者和接收者解耦,讓請求可以自由地在對象之間傳遞。

示例:

// 抽象處理器
class Handler {
? nextHandler: Handler|null = null;
? setNext(handler: Handler) {
? ? this.nextHandler = handler;
? }
? abstract handleRequest(request: number): void;
}
// 具體處理器1
class ConcreteHandler1 extends Handler {
? handleRequest(request: number) {
? ? request <= 10 ? console.log(`Request ${request} handled by ConcreteHandler1`) : this.nextHandler?.handleRequest(request);
? }
}
// 具體處理器2
class ConcreteHandler2 extends Handler {
? handleRequest(request: number) {
? ? request > 10 && request <= 20 ? console.log(`Request ${request} handled by ConcreteHandler2`) : this.nextHandler?.handleRequest(request);
? }
}
// 具體處理器3
class ConcreteHandler3 extends Handler {
? handleRequest(request) {
? ? request > 20 && request <= 80 ? console.log(`Request ${request} handled by ConcreteHandler3`) : this.nextHandler?.handleRequest(request);
? }
}
// 異常處理器
class ConcreteHandlerX extends Handler {
? handleRequest(request) {
? ? throw new Error(`Request ${request} can not be handled by ConcreteHandler chain`);
? }
}
// 創(chuàng)建處理對象
const handler1 = new ConcreteHandler1();
const handler2 = new ConcreteHandler2();
const handler3 = new ConcreteHandler3();
const errorhandler = new ConcreteHandlerX();
// 處理對象成鏈
handler1.setNext(handler2);
handler2.setNext(handler3);
handler3.setNext(errorhandler);
// 客戶端發(fā)送請求
handler1.handleRequest(5); ? // 輸出: Request 5 handled by ConcreteHandler1
handler2.handleRequest(15); ?// 輸出: Request 15 handled by ConcreteHandler2
handler3.handleRequest(25); ?// 輸出: Request 25 handled by ConcreteHandler3
handler1.handleRequest(90); ?// 直接報錯

原生實現(xiàn):

  • 事件處理機制:在瀏覽器中,事件處理機制就是一個典型的責任鏈模式的應(yīng)用。當事件發(fā)生時,它會從目標元素開始沿著 DOM 樹向上傳播,每個元素都有機會處理該事件。如果某個元素無法處理事件,它會將事件傳遞給它的父級元素,直到找到能夠處理事件的元素或者事件冒泡至根元素。

  • 中間件(Middleware)模式:在 Web 開發(fā)中,中間件模式也是一種常見的責任鏈模式的應(yīng)用。例如,Express.js 框架中的中間件允許你按照順序添加不同的中間件函數(shù)來處理 HTTP 請求。請求將依次經(jīng)過這些中間件函數(shù),每個中間件函數(shù)都有可能對請求進行處理、修改或者將請求傳遞給下一個中間件函數(shù)。

  • JavaScript Promise:Promise 是 JavaScript 中用于處理異步操作的一種機制。當使用 Promise 鏈式調(diào)用時,每個 Promise 對象都有一個 then() 方法,可以將回調(diào)函數(shù)添加到鏈條中。當前一個 Promise 對象執(zhí)行完成后,它會自動將結(jié)果傳遞給下一個 Promise 對象,形成一個責任鏈式的處理。

  • jQuery Ajax:在 jQuery 的 Ajax 功能中,可以使用 $.ajax() 方法發(fā)送異步請求,并通過 .done()、.fail().always() 等方法添加相應(yīng)的回調(diào)函數(shù)。這些回調(diào)函數(shù)可以按照順序連接起來,形成一個責任鏈,每個回調(diào)函數(shù)都有機會處理請求的結(jié)果。

總結(jié):

構(gòu)建抽象處理器類,然后子類具體處理器類重寫處理邏輯;實際化出不同的具體處理器類的實例對象,調(diào)用setNext方法成鏈,然后選擇鏈中某處作為入口,處理責任。

注意:不必從入口開始,因為可能在入鏈之前就已經(jīng)判斷過了,范圍已經(jīng)縮小了。

擴展:

鏈可以成環(huán),例如將handler3.setNext(errorhandler);改成handler3.setNext(handler1);, 從而責任傳遞永無停息,直到問題被解決。

用責任環(huán)結(jié)合定時器可以實現(xiàn)輪詢的效果。

到此這篇關(guān)于JS設(shè)計模式之責任鏈模式應(yīng)用詳解的文章就介紹到這了,更多相關(guān)JS責任鏈模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 超級標簽之一鍵解除網(wǎng)頁復(fù)制限制、網(wǎng)頁自由編輯、顯示星號密碼功能代碼

    超級標簽之一鍵解除網(wǎng)頁復(fù)制限制、網(wǎng)頁自由編輯、顯示星號密碼功能代碼

    實現(xiàn)以上功能不用安裝任何插件,把下列書簽圖標拖動到瀏覽器書簽欄,就可以實現(xiàn)一鍵解除網(wǎng)頁復(fù)制限制、網(wǎng)頁自由編輯、顯示星號密碼功能
    2022-09-09
  • JS動畫效果打開、關(guān)閉層的實現(xiàn)方法

    JS動畫效果打開、關(guān)閉層的實現(xiàn)方法

    這篇文章主要介紹了JS動畫效果打開、關(guān)閉層的實現(xiàn)方法,可實現(xiàn)js控制層從中心位置打開與關(guān)閉的功能,涉及javascript操作頁面元素的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 在JavaScript中如何訪問暫未存在的嵌套對象

    在JavaScript中如何訪問暫未存在的嵌套對象

    這篇文章主要給大家介紹了關(guān)于在JavaScript中如何訪問暫未存在的嵌套對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JavaScript實現(xiàn)隨機數(shù)生成器(去重)

    JavaScript實現(xiàn)隨機數(shù)生成器(去重)

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)隨機數(shù)生成器,生成不重復(fù)的隨機數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • JavaScript鍵盤事件常見用法實例分析

    JavaScript鍵盤事件常見用法實例分析

    這篇文章主要介紹了JavaScript鍵盤事件常見用法,簡單描述了javascript鍵盤事件的分類、功能,并結(jié)合實例形式給出了javascript響應(yīng)鍵盤事件相關(guān)使用技巧,需要的朋友可以參考下
    2019-01-01
  • js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題

    js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題

    JSON序列化指將JSON對象轉(zhuǎn)換為JSON字符串,J實現(xiàn)方式有兩種:一種是調(diào)用JSON對象內(nèi)置的stringify()函數(shù),一種是為對象自定義toJSON()函數(shù),本文重點介紹js中的bigint類型轉(zhuǎn)化為json字符串時報無法序列化的問題,感興趣的朋友一起看看吧
    2024-01-01
  • 一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    一文詳解如何用原型鏈的方式實現(xiàn)JS繼承

    JavaScript中,每當創(chuàng)建一個對象,都會給這個對象提供一個內(nèi)置對象 [[Prototype]] 。這個對象就是原型對象,[[Prototype]] 的層層嵌套就形成了原型鏈。本文將詳細講解如何用原型鏈的方式實現(xiàn)一個 JS 繼承,感興趣的可以了解下
    2022-04-04
  • 詳解如何使用babel進行es6文件的編譯

    詳解如何使用babel進行es6文件的編譯

    這篇文章主要介紹了詳解如何使用babel進行es6文件的編譯,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 深入理解JavaScript系列(27):設(shè)計模式之建造者模式詳解

    深入理解JavaScript系列(27):設(shè)計模式之建造者模式詳解

    這篇文章主要介紹了深入理解JavaScript系列(27):設(shè)計模式之建造者模式詳解,建造者模式可以將一個復(fù)雜對象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示,需要的朋友可以參考下
    2015-03-03
  • TypeScript中import?type與import的區(qū)別詳析

    TypeScript中import?type與import的區(qū)別詳析

    ES6引入了模塊化,其設(shè)計思想是在編譯時就能確定模塊的依賴關(guān)系,以及輸入和輸出的變量,下面這篇文章主要給大家介紹了關(guān)于TypeScript中import?type與import區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評論

淳化县| 方正县| 乐至县| 吉木萨尔县| 巨野县| 武平县| 广河县| 郧西县| 巨鹿县| 保亭| 铅山县| 西盟| 开平市| 昆明市| 太湖县| 四子王旗| 安岳县| 淅川县| 历史| 建平县| 龙胜| 乌拉特前旗| 新巴尔虎右旗| 北宁市| 海南省| 新田县| 正蓝旗| 屏东县| 夏津县| 大埔区| 徐闻县| 虹口区| 杭州市| 南开区| 喜德县| 峨眉山市| 卢湾区| 涟源市| 隆子县| 玉山县| 灵璧县|