JavaScript實現職責鏈模式

什么是職責鏈模式

  職責鏈模式的定義是:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系,將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。舉個例子:當你從公交車后門上車之后,你不可能直接把硬幣放到收款箱里面, 因為你不知道它在哪,那你就只能把硬幣給你前面一個人,讓他幫你傳到前面一個人手上,這樣一直傳遞到站在收款箱旁邊人的手上,由他把硬幣放到收款箱里面。

?

職責鏈模式思想

  請求發送者只需要知道鏈中的第一個節點,從而弱化了發送者和一組接收者之間的強聯系。

?

JavaScript實現職責鏈模式(AOP方式)

  

  Function.prototype.after = function(fn) {var _self = this;return function () {var ret = _self.apply(this, arguments);if(ret === "nextSuccessor") {return fn.apply(this, arguments);}return ret;}}

  是的沒錯,在JavaScript中實現職責鏈模式就是如此的簡單,如果對上面AOP代碼不了解可以參考我之前寫的這篇文章JavaScript實現AOP,這個方式和裝飾者模式看起來很像,從代碼上來看確實很像,但是他們的出發點是完全不同的

  AOP實現裝飾者模式:在不改變已有函數內部的情況下添加一些新的功能,你可以想象一下同心圓,你每調用一次after,就相當于給你的圓外面又加了一個圓來包裹住它。注意它們是包含關系

  AOP實現職責鏈模式:在函數執行之后確定是否執行下一個函數,你每次調用after,都相當于在已有函數之后添加一個函數,至于是否執行后面這個函數,取決于前一個函數的返回值。注意它們是鏈式關系

?

職責鏈模式實例

  

function cat (type) {if(type == "cat") {console.log("我是貓貓");} else {return "nextSuccessor"}
}function dog (type) {if(type == "dog") {console.log("我是狗狗");} else {return "nextSuccessor"}
}function pig (type) {if(type == "pig") {console.log("我是豬豬");} else {return "nextSuccessor"}
}Function.prototype.after = function(fn) {var _self = this;return function () {var ret = _self.apply(this, arguments);if(ret === "nextSuccessor") {return fn.apply(this, arguments);}return ret;}
}var pet = cat.after(dog).after(pig);pet("pig");  //我是豬豬
pet("dog");  //我是狗狗
pet("cat");  //我是貓貓

  請看上述代碼,我們給pet方法傳入了三個不同的參數,得到了不同的結果。拿第一次調用舉例,其執行過程是這樣的:傳入“pig”,先由cat方法判斷,cat方法發現自己處理不了,于是把“pig”傳遞給dog方法(return "nextSuccessor"來表示傳遞給下一個函數),dog方法發現自己也處理不了,再接著把“pig”傳遞到pig方法,pig方法可以處理,控制臺打印,我是豬豬。

你可能會覺得這不是浪費精神么,上述功能只需使用下面的幾行代碼就能解決,為何還要多寫上面那么多代碼

function pet(type) {if(type == "cat") {console.log("我是貓貓");} else if(type == "dog") {console.log("我是狗狗");} else if(type == "pig") {console.log("我是豬豬");}
}pet("pig");  //我是豬豬
pet("dog");  //我是狗狗
pet("cat");  //我是貓貓

  這樣看來,好像是簡單了很多。但是你有沒有考慮過,如果以后突然多了猴子這種動物,如果使用上面的垃圾代碼,那你就要去修改pet函數的源碼,多添加一條if語句判斷是不是猴子,其實這也還好,如果是加了1萬種動物呢?那你就要在pet這個函數里添加1萬條if語句,什么?還不夠浮夸?那你有沒有考慮過一種動物還會分很多品種,比如說貓咪分為長毛貓,短毛貓。這樣你的代碼就會涉及到嵌套if語句。恕我直言,現在你的代碼已經丑成狗了,嘻嘻

  但是如果使用職責鏈模式,每多一個種動物,我們就給他定義一個函數,然后添加到職責鏈上,這樣一來,新的函數就和原來的函數高度解耦。并且我們的請求發送者只需要傳遞給鏈的第一個節點,而不用關心傳遞給具體哪一個節點,反正它會順著職責鏈傳送下去,直到找到能處理請求的那個節點,并且處理請求。豈不美哉?

?

?

?

    

轉載于:https://www.cnblogs.com/yonglin/p/8339239.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390301.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390301.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390301.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Metrics介紹和Spring的集成

參考: http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/ https://www.cnblogs.com/yangecnu/p/Using-Metrics-to-Profiling-WebService-Performance.html

配置 aws cli_AWS CLI教程–如何安裝,配置和使用AWS CLI了解您的資源環境

配置 aws cliHow to get exactly the account and environment information you need to manage your AWS account using just the AWS CLI如何僅使用AWS CLI準確獲取管理AWS賬戶所需的賬戶和環境信息 Installing the AWS CLI is actually quite simple. The best way to get …

grep遞歸查找頭文件_Grep命令教程–如何使用遞歸查找在Linux和Unix中搜索文件

grep遞歸查找頭文件grep stands for Globally Search For Regular Expression and Print out. It is a command line tool used in UNIX and Linux systems to search a specified pattern in a file or group of files. grep代表全局搜索正則表達式并打印出來 。 它是UNIX和Li…

C++ 前置聲明

(一)class的前置聲明 class的前置聲明有兩種。 pre.hclass PreA {}; main.hclass PreA; class Main {};//或者 class Main {class PreA* A; }; (二) struct前置聲明 struct的前置聲明只能用第一種。 (三) 有typedef的前置聲明 Pr…

2.18 特殊權限set_uid 2.19 特殊權限set_gid 2.20 特殊權限stick_bit 2.21 軟鏈接文件 2.22 硬連接文件...

2019獨角獸企業重金招聘Python工程師標準>>> 特殊權限set_uid set_uid:該權限針對二進制可執行文件,使文件在執行階段具有文件所有者的權限; 通俗一點講就是,普通用戶想要訪問一個沒有其他用戶可執行權限的目錄時,暫時…

345. 反轉字符串中的元音字母

345. 反轉字符串中的元音字母 給你一個字符串 s ,僅反轉字符串中的所有元音字母,并返回結果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小寫兩種形式出現。 示例 1: 輸入:s “hello” 輸…

通過制作數字桌面游戲和Web應用程序學習JavaScript

Building 2D games can be a great way to learn JavaScript, especially when working through the basics of complex tabletop game logic.制作2D游戲可能是學習JavaScript的好方法,尤其是在研究復雜的桌面游戲邏輯基礎時。 In this series, I’m going to intr…

【HAVENT原創】Node Express API 通用配置

為什么80%的碼農都做不了架構師?>>> ( 基于 Express 4.x ) 啟動文件 /app.js: var express require(express); var bodyParser require(body-parser); var proxy require(http-proxy-middleware); var path require(path);var index re…

C#使用Json.NET解析Json

本文轉載自 http://xiaosheng.me/2016/10/01/article25/ 最近在 C# 項目中需要使用到 Json 格式的數據,我簡單上網搜索了一下,基本上有兩種操作 Json 數據的方法: 使用 Windows 系統自帶的類使用第三方的包本著“第三方包一定有比系統自帶類優…

現在JavaScript日期–如何在JavaScript中獲取當前日期

Many applications you build will have some sort of a date component, whether its the creation date of a resource, or the timestamp of an activity. 您構建的許多應用程序都將具有某種日期組件,無論是資源的創建日期還是活動的時間戳。 Dealing with date…

233. 數字 1 的個數

給定一個整數 n,計算所有小于等于 n 的非負整數中數字 1 出現的個數。 示例 1: 輸入:n 13 輸出:6 示例 2: 輸入:n 0 輸出:0 解題思路 正確性證明 例如:對于n3015&#xff0c…

Linux串口設置參數

為什么80%的碼農都做不了架構師?>>> 在Linux環境下,串口名從ttyS0開始依次是ttyS1、ttyS2等。在本程序中,使用ttyS0作為通信串口。在打開ttyS0的時候選項 O_NOCTTY 表示不能把本串口當成控制終端,否則用戶的鍵盤輸入信…

STM32F013 十元板

我大拇指般大小。STM32F103C8T6,64K Flash,20K RAM,m3的核。十元,應該是價格極限了吧。 通過USB供電(5V),也可以排針3.3V供電。可惜沒有引出5V排針。USB口可以供電和USB通訊,沒有USB…

如何在Python中建立和訓練K最近鄰和K-Means集群ML模型

One of machine learnings most popular applications is in solving classification problems.機器學習最流行的應用之一是解決分類問題。 Classification problems are situations where you have a data set, and you want to classify observations from that data set in…

552. 學生出勤記錄 II

552. 學生出勤記錄 II 可以用字符串表示一個學生的出勤記錄,其中的每個字符用來標記當天的出勤情況(缺勤、遲到、到場)。記錄中只含下面三種字符: ‘A’:Absent,缺勤 ‘L’:Late,遲…

C/C++中計算函數運行時間

#include<stdio.h> #include<time.h> clock_t start,stop;//clock_t 是clock&#xff08;&#xff09;函數返回變量的類型 double duration;//記錄被測函數的運行時間&#xff0c;以秒為單位 int main() { startclock();//開始計時 MyFunction();//把被測函數加在這…

作為一名前端開發工程師,你必須掌握的WEB模板引擎:Handlebars

為什么需要使用模板引擎&#xff1f; 關于為什么要使用模板引擎&#xff0c;按照我常說的一句話就是&#xff1a;不用重復造輪子了。 簡單來說&#xff0c;模板最本質的作用是“變靜為動”&#xff0c;一切利于這方面的都是優勢&#xff0c;不利于的都是劣勢。要想很好地實現“…

extjs 實用開發指南_如何提出有效問題:針對開發人員的實用指南

extjs 實用開發指南Learning is a journey that never ends. At every point in your career, you will keep learning, re-learning, and un-learning. 學習是一個永無止境的旅程。 在職業生涯的每個階段&#xff0c;您都會不斷學習&#xff0c;重新學習和不學習。 The abil…

LOJ 6270

最近&#xff08;一直&#xff09;有點&#xff08;很&#xff09;蠢 按照區間大小排序做區間包含多少區間的話 只用考慮 左端點比當前左端點小的和右端點比當前右端點大的&#xff0c;因為不可能同時滿足 關于K&#xff0c;就在做到K的時候減一下就好了&#xff0c;一直傻逼在…

Zabbix3.4安裝詳細步驟

Zabbix3.4安裝的詳細步驟一、zabbix介紹現在大多數公司都會用到監控軟件&#xff0c;主流的監控軟件就是Zabbix了&#xff0c;當然還會有Nagios等其他的軟件&#xff1a;zabbix是一個基于WEB界面的提供分布式系統監視以及網絡監視功能的企業級的開源解決方案。zabbix能監視各種…