摘要:責(zé)任鏈模式責(zé)任鏈模式指的是某個(gè)請求需要多個(gè)對象進(jìn)行處理,從而避免請求的發(fā)送者和接收之間的耦合關(guān)系。介紹了這么多生活中責(zé)任鏈模式的例子的,下面具體給出面向?qū)ο笾胸?zé)任鏈模式的定義。
責(zé)任鏈模式
責(zé)任鏈模式指的是——某個(gè)請求需要多個(gè)對象進(jìn)行處理,從而避免請求的發(fā)送者和接收之間的耦合關(guān)系。將這些對象連成一條鏈子,并沿著這條鏈子傳遞該請求,直到有對象處理它為止。實(shí)現(xiàn)從生活中的例子可以發(fā)現(xiàn),某個(gè)請求可能需要幾個(gè)人的審批,即使技術(shù)經(jīng)理審批完了,還需要上一級(jí)的審批。這樣的例子,還有公司中的請假,少于3天的,直屬Leader就可以批準(zhǔn),3天到7天之內(nèi)就需要項(xiàng)目經(jīng)理批準(zhǔn),多余7天的就需要技術(shù)總監(jiān)的批準(zhǔn)了。介紹了這么多生活中責(zé)任鏈模式的例子的,下面具體給出面向?qū)ο笾胸?zé)任鏈模式的定義。
責(zé)任鏈模式涉及的對象只有處理者角色,但由于有多個(gè)處理者,它們具有共同的處理請求的方法,所以這里抽象出一個(gè)抽象處理者角色進(jìn)行代碼復(fù)用.
請求類
// 采購請求 let PurchaseRequest = function (amount, productName) { this.amount = amount; this.productName = productName; };
處理者接口類
// 審批人,Handler let Approver = function (name, nextApprover) { this.name = name; this.nextApprover = nextApprover; }; Approver.prototype.processRequest = function () { throw new Error(); };
處理者類
// ConcreteHandler let Manager = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(Manager, Approver); Manager.prototype.processRequest = function (request) { if (request.Amount < 10000.0) { console.log("ok"); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } }; // ConcreteHandler,副總 let VicePresident = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(VicePresident, Approver); VicePresident.prototype.processRequest = function (request) { if (request.Amount < 25000.0) { console.log("ok"); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } }; // ConcreteHandler,總經(jīng)理 let President = function (name, nextApprover) { Approver.call(this, name, nextApprover); }; extend(President, Approver); President.prototype.processRequest = function (request) { if (request.Amount < 100000.0) { console.log("ok"); } else if (NextApprover != null) { this.nextApprover.ProcessRequest(request); } };測試
let requestTelphone = new PurchaseRequest(4000.0, "Telphone"); let requestSoftware = new PurchaseRequest(10000.0, "Visual Studio"); let requestComputers = new PurchaseRequest(40000.0, "Computers"); let manager = new Manager("LearningHard"); let Vp = new VicePresident("Tony"); let Pre = new President("BossTom"); // 設(shè)置責(zé)任鏈 manager.NextApprover = Vp; Vp.NextApprover = Pre; // 處理請求 manager.ProcessRequest(requestTelphone); manager.ProcessRequest(requestSoftware); manager.ProcessRequest(requestComputers);
使用場景
一個(gè)系統(tǒng)的審批需要多個(gè)對象才能完成處理的情況下,例如請假系統(tǒng)等。
代碼中存在多個(gè)if-else語句的情況下,此時(shí)可以考慮使用責(zé)任鏈模式來對代碼進(jìn)行重構(gòu)。
特點(diǎn)
降低了請求的發(fā)送者和接收者之間的耦合。
把多個(gè)條件判定分散到各個(gè)處理類中,使得代碼更加清晰,責(zé)任更加明確。
責(zé)任鏈模式也具有一定的缺點(diǎn),如:
在找到正確的處理對象之前,所有的條件判定都要執(zhí)行一遍,當(dāng)責(zé)任鏈過長時(shí),可能會(huì)引起性能的問題, 可能導(dǎo)致某個(gè)請求不被處理。
總結(jié)
責(zé)任鏈降低了請求端和接收端之間的耦合,使多個(gè)對象都有機(jī)會(huì)處理某個(gè)請求。使得責(zé)任分割, 更具體, 有助于拓展
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92970.html
摘要:前言近期在做的攔截器功能,正好用到了責(zé)任鏈模式。通過官方圖就可以非常清楚的看出是一個(gè)責(zé)任鏈模式用責(zé)任鏈模式設(shè)計(jì)一個(gè)攔截器對于攔截器來說使用責(zé)任鏈模式再好不過了。設(shè)置攔截器到責(zé)任鏈中時(shí)通過反射將的值保存到各個(gè)攔截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...
摘要:責(zé)任鏈模式涉及到的角色如下所示抽象處理者角色定義一個(gè)處理請求的抽象類。如果一個(gè)類承擔(dān)了一部分責(zé)任,還將請求踢給下一個(gè)皮球,則被稱為不純的責(zé)任鏈模式。一般來說,日常開發(fā)中不純的責(zé)任鏈模式用的比較多一點(diǎn)。參考責(zé)任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責(zé)任鏈(Chain of Responsibility)模式的: 責(zé)任鏈模式是一種對象的行為模式。在責(zé)任鏈模式里,...
摘要:咦這一層一層上報(bào)就涉及到這次的責(zé)任鏈模式。責(zé)任鏈模式和觀察者模式存在一個(gè)共同點(diǎn),就是傳遞責(zé)任鏈模式是一級(jí)一級(jí)的傳遞,形成一條鏈,鏈節(jié)點(diǎn)處理者之間是存在傳遞關(guān)系的。這是責(zé)任鏈模式和觀察者模式的區(qū)別,也是責(zé)任鏈模式的核心。 今天來說說程序員小猿和產(chǎn)品就關(guān)于需求發(fā)生的故事。前不久,小猿收到了產(chǎn)品的需求。 產(chǎn)品經(jīng)理:小猿,為了迎合大眾屌絲用戶的口味,我們要放一張圖,要露點(diǎn)的。 小猿:........
閱讀 2715·2019-08-30 15:53
閱讀 2899·2019-08-29 16:20
閱讀 1108·2019-08-29 15:10
閱讀 1051·2019-08-26 10:58
閱讀 2218·2019-08-26 10:49
閱讀 660·2019-08-26 10:21
閱讀 734·2019-08-23 18:30
閱讀 1658·2019-08-23 15:58