摘要:責任鏈模式責任鏈模式指的是某個請求需要多個對象進行處理,從而避免請求的發送者和接收之間的耦合關系。介紹了這么多生活中責任鏈模式的例子的,下面具體給出面向對象中責任鏈模式的定義。
責任鏈模式
責任鏈模式指的是——某個請求需要多個對象進行處理,從而避免請求的發送者和接收之間的耦合關系。將這些對象連成一條鏈子,并沿著這條鏈子傳遞該請求,直到有對象處理它為止。實現從生活中的例子可以發現,某個請求可能需要幾個人的審批,即使技術經理審批完了,還需要上一級的審批。這樣的例子,還有公司中的請假,少于3天的,直屬Leader就可以批準,3天到7天之內就需要項目經理批準,多余7天的就需要技術總監的批準了。介紹了這么多生活中責任鏈模式的例子的,下面具體給出面向對象中責任鏈模式的定義。
責任鏈模式涉及的對象只有處理者角色,但由于有多個處理者,它們具有共同的處理請求的方法,所以這里抽象出一個抽象處理者角色進行代碼復用.
請求類
// 采購請求 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,總經理 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"); // 設置責任鏈 manager.NextApprover = Vp; Vp.NextApprover = Pre; // 處理請求 manager.ProcessRequest(requestTelphone); manager.ProcessRequest(requestSoftware); manager.ProcessRequest(requestComputers);
使用場景
一個系統的審批需要多個對象才能完成處理的情況下,例如請假系統等。
代碼中存在多個if-else語句的情況下,此時可以考慮使用責任鏈模式來對代碼進行重構。
特點
降低了請求的發送者和接收者之間的耦合。
把多個條件判定分散到各個處理類中,使得代碼更加清晰,責任更加明確。
責任鏈模式也具有一定的缺點,如:
在找到正確的處理對象之前,所有的條件判定都要執行一遍,當責任鏈過長時,可能會引起性能的問題, 可能導致某個請求不被處理。
總結
責任鏈降低了請求端和接收端之間的耦合,使多個對象都有機會處理某個請求。使得責任分割, 更具體, 有助于拓展
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92970.html
摘要:前言近期在做的攔截器功能,正好用到了責任鏈模式。通過官方圖就可以非常清楚的看出是一個責任鏈模式用責任鏈模式設計一個攔截器對于攔截器來說使用責任鏈模式再好不過了。設置攔截器到責任鏈中時通過反射將的值保存到各個攔截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...
摘要:責任鏈模式涉及到的角色如下所示抽象處理者角色定義一個處理請求的抽象類。如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。一般來說,日常開發中不純的責任鏈模式用的比較多一點。參考責任鏈模式更多文章 在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的: 責任鏈模式是一種對象的行為模式。在責任鏈模式里,...
摘要:咦這一層一層上報就涉及到這次的責任鏈模式。責任鏈模式和觀察者模式存在一個共同點,就是傳遞責任鏈模式是一級一級的傳遞,形成一條鏈,鏈節點處理者之間是存在傳遞關系的。這是責任鏈模式和觀察者模式的區別,也是責任鏈模式的核心。 今天來說說程序員小猿和產品就關于需求發生的故事。前不久,小猿收到了產品的需求。 產品經理:小猿,為了迎合大眾屌絲用戶的口味,我們要放一張圖,要露點的。 小猿:........
閱讀 2632·2019-08-30 15:53
閱讀 2870·2019-08-29 16:20
閱讀 1081·2019-08-29 15:10
閱讀 1018·2019-08-26 10:58
閱讀 2188·2019-08-26 10:49
閱讀 630·2019-08-26 10:21
閱讀 700·2019-08-23 18:30
閱讀 1635·2019-08-23 15:58