-
在這里講解了后繼是如何設(shè)置的。比如銷(xiāo)售做不了折扣將折扣交給后繼,此時(shí)在工廠方法中設(shè)置了銷(xiāo)售員的后繼是經(jīng)理,經(jīng)理就開(kāi)始對(duì)折扣處理,經(jīng)理做不了,設(shè)置后繼為Director,讓Director處理…… PriceHandler.createPriceHandler(); PriceHandler sales=new Sales(); sales.setSuccessor(manager); ... ...查看全部
-
責(zé)任鏈結(jié)構(gòu)上的關(guān)鍵在handler持有對(duì)自己的引用 抽象接口handler中有兩個(gè)方法,一個(gè)是持有對(duì)自身的引用,一個(gè)是處理折扣的抽象方法,具體的實(shí)現(xiàn)放在了銷(xiāo)售人員、經(jīng)理CEO等對(duì)折扣的處理,如果接收的折扣能夠處理則批準(zhǔn),不能處理則把具體折扣交給后繼successor調(diào)用processDiscount()方法來(lái)處理。疑問(wèn),這個(gè)后繼是誰(shuí)??查看全部
-
責(zé)任鏈模式的應(yīng)用: 責(zé)任鏈模式在日常編碼中可能不是經(jīng)常用到的模式,但不管是前端還是后端工程師都可能天天接接觸到責(zé)任鏈模式. JAVA中的異常處理機(jī)制是使用責(zé)任鏈模式 JavaScript的事件模式也是責(zé)任鏈模式 JAVAEE中的Filter經(jīng)??梢栽谡?qǐng)求到達(dá)核心代碼之前對(duì)它進(jìn)行攔截并作出一些操作,當(dāng)多個(gè)Filter存在的時(shí)候就共同構(gòu)成了一個(gè)FilterChain,FilterChain不是一個(gè)存的責(zé)任鏈,責(zé)任鏈模式中只能有一個(gè)對(duì)象來(lái)處理請(qǐng)求,而FilterChain中可以有多個(gè)對(duì)象同時(shí)處理請(qǐng)求.查看全部
-
開(kāi)閉原則(OO中的一個(gè)基本原則):對(duì)擴(kuò)展開(kāi)放,對(duì)變更關(guān)閉,即是如果有一個(gè)業(yè)務(wù)變更,希望新增一個(gè)類(lèi),而非修改原有代碼來(lái)滿足業(yè)務(wù)需求. 責(zé)任鏈模式的執(zhí)行性能:當(dāng)有請(qǐng)求到達(dá)時(shí)會(huì)從責(zé)任鏈頭部開(kāi)始遍歷整條責(zé)任鏈,直到有一個(gè)處理器處理了請(qǐng)求,或者是整個(gè)鏈條遍歷完成,在這過(guò)程中性能的損耗體現(xiàn)在兩個(gè)方面. 第一是時(shí)間,相對(duì)于單個(gè)Handler處理請(qǐng)求的時(shí)間而言,整個(gè)鏈條的遍歷過(guò)程會(huì)消耗更多的時(shí)間. 第二是內(nèi)存,使用責(zé)任鏈模式創(chuàng)建了大量對(duì)象來(lái)表示處理器對(duì)象,但僅僅使用了其中的少部分,剩余的大部分處理器都僅僅作為一個(gè)過(guò)客.查看全部
-
在Sales與Manager之間加入一個(gè)Lead(銷(xiāo)售小組)層級(jí).它可以處理15%的折扣. 只需創(chuàng)建一個(gè)Lead類(lèi)實(shí)現(xiàn)Handler接口,并在Handler工廠方法中重新構(gòu)造責(zé)任鏈即可. Customer類(lèi)依賴于PriceHander接口與PriceHandlerFactory工廠類(lèi),依然沒(méi)有去依賴那些PriceHandler的實(shí)現(xiàn)類(lèi),因此說(shuō)Customer與Handler之間是非常少的耦合. 將客戶端看成一個(gè)模塊,將Handler看成另外一個(gè)模塊,兩個(gè)模塊之間的耦合是非常小的,它僅僅耦合于Handler模塊對(duì)外提供的一個(gè)接口以及這個(gè)接口的工廠類(lèi). 解耦就是客戶端代碼和業(yè)務(wù)核心邏輯之間的關(guān)系問(wèn)題,在責(zé)任鏈模式中,客戶端代碼并不知道責(zé)任鏈上的哪一個(gè)接收者會(huì)處理其請(qǐng)求,也就是說(shuō)它與業(yè)務(wù)邏輯之間是松散的關(guān)聯(lián),客戶端程序并不關(guān)注具體的Handler.因此可以輕易實(shí)現(xiàn)業(yè)務(wù)的變更.查看全部
-
4.創(chuàng)建工廠方法為Handler構(gòu)成責(zé)任鏈. //工廠方法 public class HandlerFactory{ //創(chuàng)建構(gòu)造責(zé)任鏈方法,返回一個(gè)Handler給客戶端使用. public static PriceHandler createPriceHandler(){ //創(chuàng)建所有Handler的實(shí)現(xiàn)類(lèi)實(shí)例 PriceHandler sales=new Sales(); PriceHandler manger=new Manager(); PriceHandler vp=new VicePresident(); PriceHandler ceo=new CEO(); //使用Handler接口的setPriceHandler()方法進(jìn)行責(zé)任鏈的構(gòu)造,指定這些Handler的直接后繼. sales.setSuccessor(manger); manger.setSuccessor(vp); vp.setSuccessor(ceo); //最后返回一個(gè)Handler去處理客戶端的請(qǐng)求,此處返回一個(gè)銷(xiāo)售者(責(zé)任鏈的第一個(gè)Handler). return sales; } } 5.創(chuàng)建測(cè)試類(lèi)測(cè)試 Customer customer = new Customer(); //客戶端請(qǐng)求Handler customer.setPriceHandler(HandlerFactory.createPriceHandler()); customer.requestDiscount(0.15); 那么控制臺(tái)顯示由經(jīng)理處理了請(qǐng)求.客戶端并不知道是誰(shuí)處理了請(qǐng)求,他只得到了一個(gè)處理的結(jié)果.避免了客戶端與Handler之間的耦合.查看全部
-
例子: 1.創(chuàng)建Handler接口 public abstract class PriceHandler{ //直接后繼 protected PriceHandler successor; public void setSuccessor(PriceHandler successor){ this.successor=successor; } //聲明處理折扣的方法. public abstract void processDiscount(float discount); } 2.創(chuàng)建接口實(shí)現(xiàn)類(lèi) //銷(xiāo)售,可以批準(zhǔn)5%以內(nèi)的折扣 public class Sales extends PriceHandler{ public void processDiscount(float discount){ if(discount<=0.05){ System.out.println("this.getClass().getName()"+批準(zhǔn)了"+discount+"折扣"); }else{ //把請(qǐng)求交給后繼Handler處理 successor.processDiscount(discount); } } } 其他manger(0.2)、vice president(0.3)、CEO(0.5)實(shí)現(xiàn)類(lèi)也如此,但注意的是CEO的實(shí)現(xiàn)類(lèi)中是最上一級(jí)了,因此沒(méi)有后繼,當(dāng)不滿足折扣需求時(shí),則告訴客戶不賣(mài)了 3.創(chuàng)建客戶類(lèi) //客戶,請(qǐng)求折扣 public class Customer{ //Handler接口的引用,代表請(qǐng)求教給哪個(gè)Handler處理 private PrivateHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler){ this.priceHandler=priceHandler; } //客戶請(qǐng)求折扣的方法 public void requestDiscount(float discount){ //調(diào)用Handler處理折扣的方法. priceHandler.processDiscount(discount); } } Customer類(lèi)只關(guān)心折扣請(qǐng)求是否被處理了,而不關(guān)心最終是由誰(shuí)處理的.查看全部
-
責(zé)任鏈模式實(shí)現(xiàn) 責(zé)任鏈模式是在Client與Handler之間的請(qǐng)求處理關(guān)系. 步驟: 1.創(chuàng)建一個(gè)Handler接口(使用抽象),類(lèi)中存在一個(gè)Handler的引用,該引用是為了用來(lái)指向當(dāng)前Handler的后繼Handler,生成set方法,并創(chuàng)建處理客戶端請(qǐng)求的業(yè)務(wù)抽象方法. 2.創(chuàng)建Handler的實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)抽象方法,如果當(dāng)前Handler能夠處理請(qǐng)求,則處理,否則交給其后繼Handler處理,即調(diào)用后繼引用的抽象方法. 3.創(chuàng)建客戶類(lèi),該類(lèi)中存在一個(gè)Handler接口的引用,代表把請(qǐng)求傳遞給哪個(gè)Handler處理.還要?jiǎng)?chuàng)建請(qǐng)求Handler的業(yè)務(wù)方法. 4.創(chuàng)建工廠方法為Handler構(gòu)成責(zé)任鏈,方法內(nèi)部實(shí)例化所有Handler的實(shí)現(xiàn)類(lèi),并指定這些Handler實(shí)現(xiàn)類(lèi)的直接后繼,方法返回責(zé)任鏈的第一個(gè)Handler去處理客戶端的請(qǐng)求. 5.創(chuàng)建測(cè)試類(lèi),創(chuàng)建客戶端實(shí)例,并為客戶端中的Handler引用進(jìn)行賦值,最后調(diào)用請(qǐng)求方法.查看全部
-
責(zé)任鏈例子: 售樓處接待買(mǎi)房的人是一線銷(xiāo)售者(Sales),它的上級(jí)是經(jīng)理(Manager),再上一級(jí)是副總裁(Vice President),,最高一級(jí)是CEO.每個(gè)級(jí)別可以決定的最大折扣是有限制的. 假設(shè)銷(xiāo)售者最大能批準(zhǔn)0.05的折扣,經(jīng)理最大可以批準(zhǔn)0.2的折扣,副總裁最大可以批準(zhǔn)0.3的折扣,CEO最大可以批準(zhǔn)0.5的折扣,大于這個(gè)折扣的不賣(mài).首先接待顧客的是銷(xiāo)售者(Handler),如果客戶說(shuō)要打0.03折,則在銷(xiāo)售者范圍內(nèi),則可以批準(zhǔn),如果客戶說(shuō)要打0.3折,則銷(xiāo)售者就要向上級(jí)請(qǐng)求,直到有一級(jí)有權(quán)力批準(zhǔn)滿足的Handler. 在JAVA中,意義上的接口可以使用interface或abstract class查看全部
-
責(zé)任鏈模式: 將接收者對(duì)象連成一條鏈,并在該鏈上傳遞請(qǐng)求,直到有一個(gè)接收者對(duì)象處理它,通過(guò)讓更多對(duì)象有機(jī)會(huì)處理請(qǐng)求,避免了請(qǐng)求的發(fā)送者和接收者之間的偶爾. 圖中客戶端像Handler接口發(fā)送一個(gè)請(qǐng)求,而Handler接口中存在著自己接口類(lèi)型的引用,并且指向后繼,循環(huán)形成一條HandlerChain.請(qǐng)求只在某一個(gè)Handler上進(jìn)行處理.查看全部
-
在js中的應(yīng)用,冒泡和捕獲查看全部
-
責(zé)任鏈在java中的應(yīng)用-異常處理查看全部
-
什么是責(zé)任鏈模式查看全部
-
Handler Chain:每個(gè)人都是個(gè)handler,通過(guò)收尾相接,將花球向下傳遞。 花球代表Request 擊鼓人代表Client COR包裝的對(duì)象,依賴于抽象,而非依賴于具體。輕而易舉實(shí)現(xiàn)業(yè)務(wù)變更,低耦合,當(dāng)增加新的對(duì)象,不影響原有代碼。 1、基于開(kāi)閉原則 新增一個(gè)類(lèi),而非修改原有代碼。 2、執(zhí)行性能 性能損耗在兩個(gè)方面:時(shí)間和內(nèi)存。無(wú)用處理器太多,耗費(fèi)內(nèi)存。查看全部
-
client調(diào)用抽象handler類(lèi)或接口,該handler有指向自己的一個(gè)對(duì)象,且包含多個(gè)具體類(lèi)。 在該抽象類(lèi)中還包含了責(zé)任鏈中調(diào)用的先后關(guān)系。當(dāng)具體類(lèi)發(fā)現(xiàn)自己并不適合該請(qǐng)求時(shí),將請(qǐng)求轉(zhuǎn)發(fā)給責(zé)任鏈中的后者查看全部
舉報(bào)
0/150
提交
取消