摘要:責(zé)任鏈模式涉及到的角色如下所示抽象處理者角色定義一個(gè)處理請(qǐng)求的抽象類。如果一個(gè)類承擔(dān)了一部分責(zé)任,還將請(qǐng)求踢給下一個(gè)皮球,則被稱為不純的責(zé)任鏈模式。一般來說,日常開發(fā)中不純的責(zé)任鏈模式用的比較多一點(diǎn)。參考責(zé)任鏈模式更多文章
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責(zé)任鏈(Chain of Responsibility)模式的:
責(zé)任鏈模式是一種對(duì)象的行為模式。在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求。發(fā)出這個(gè)請(qǐng)求的客戶端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任。
責(zé)任鏈模式涉及到的角色如下所示:
抽象處理者(Handler)角色:定義一個(gè)處理請(qǐng)求的抽象類。如果需要,可以定義一個(gè)方法以設(shè)定和返回對(duì)下家的引用。
具體處理者(ConcreteHandler)角色:具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理者可以訪問下家。
舉一個(gè)簡單的例子,部門辦活動(dòng)需要報(bào)銷。報(bào)銷處職員可以處理單次500元以下的業(yè)務(wù),超過500需要和處長聯(lián)系。而處長只能處理單次1000元一下的業(yè)務(wù),再高就只能找老大報(bào)了。但是老大目前只能處理單次1500元以下的業(yè)務(wù),再高目前只能拒絕報(bào)銷了。
這個(gè)例子的具體實(shí)現(xiàn)為:
抽象類Handler
public abstract class Handler { protected Handler nextHandler = null; public Handler getNextHandler() { return nextHandler; } public void setNextHandler(Handler nextHandler) { this.nextHandler = nextHandler; } public abstract String dispose(String user , double fee); }
職員類:
public class StaffMember extends Handler { @Override public String dispose(String user, double fee) { if(fee < 500){ System.out.println("職員 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
處長類:
public class SectionChief extends Handler { @Override public String dispose(String user, double fee) { if(fee < 1000){ System.out.println("小主管 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
老大類:
public class Director extends Handler { @Override public String dispose(String user, double fee) { if(fee < 5000){ System.out.println("老大 給了 "+user+" "+fee+"元"); }else if (super.getNextHandler() == null){ System.out.println("誰都處理不了 "+user+" 要 "+fee+"元的事情"); }else { super.getNextHandler().dispose(user,fee); } return null; } }
Main方法:
public class Main { public static void main(String[] args){ StaffMember staffMember = new StaffMember(); SectionChief sectionChief = new SectionChief(); Director director = new Director(); //set Handler staffMember.setNextHandler(sectionChief); sectionChief.setNextHandler(director); staffMember.dispose("小王",400); staffMember.dispose("小混混",800); staffMember.dispose("老李",1200); staffMember.dispose("小明",10000); } }
最后的結(jié)果就是:
純責(zé)任鏈模式和不純的責(zé)任鏈模式
如果一個(gè)類要么承擔(dān)責(zé)任處理請(qǐng)求要么將請(qǐng)求踢給下一個(gè)皮球,則被稱為純責(zé)任鏈模式。
如果一個(gè)類承擔(dān)了一部分責(zé)任,還將請(qǐng)求踢給下一個(gè)皮球,則被稱為不純的責(zé)任鏈模式。
一般來說,日常開發(fā)中不純的責(zé)任鏈模式用的比較多一點(diǎn)。
參考:
java責(zé)任鏈模式
更多文章:http://blog.gavinzh.com
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65554.html
摘要:簡介職責(zé)鏈模式有時(shí)候也叫責(zé)任鏈模式,它是一種對(duì)象行為的設(shè)計(jì)模式。中的就是使用了責(zé)任鏈模式。純的責(zé)任鏈模式的實(shí)際例子很難找到,一般看到的例子均是不純的責(zé)任鏈模式的實(shí)現(xiàn)。如果堅(jiān)持責(zé)任鏈不純便不是責(zé)任鏈模式,那么責(zé)任鏈模式便不會(huì)有太大意義了。 Java設(shè)計(jì)模式之職責(zé)鏈模式 前幾天復(fù)習(xí)java的異常處理時(shí),接觸到了責(zé)任鏈模式。在企業(yè)級(jí)應(yīng)用中,從前臺(tái)發(fā)過來的請(qǐng)求在后臺(tái)拋出異常,異常處理的設(shè)計(jì)一般...
摘要:責(zé)任鏈模式的具體運(yùn)用以及原理請(qǐng)參見筆者責(zé)任鏈模式改進(jìn)方式引入適配器模式關(guān)于接口適配器模式原理以及使用場(chǎng)景請(qǐng)參見筆者適配器模式。 1 責(zé)任鏈模式現(xiàn)存缺點(diǎn) 由于責(zé)任鏈大多數(shù)都是不純的情況,本案例中,只要校驗(yàn)失敗就直接返回,不繼續(xù)處理接下去責(zé)任鏈中的其他校驗(yàn)邏輯了,故而出現(xiàn)如果某個(gè)部分邏輯是要由多個(gè)校驗(yàn)器組成一個(gè)整理的校驗(yàn)邏輯的話,則此責(zé)任鏈模式則顯現(xiàn)出了它的不足之處了。(責(zé)任鏈模式的具體運(yùn)...
世界上最遙遠(yuǎn)的距離,不是生與死,而是它從你的世界路過無數(shù)次,你卻選擇視而不見,你無情,你冷酷啊...... showImg(https://segmentfault.com/img/remote/1460000019550563); 被你忽略的就是責(zé)任鏈設(shè)計(jì)模式,希望它再次經(jīng)過你身旁你會(huì)猛的發(fā)現(xiàn),并對(duì)它微微一笑...... 責(zé)任鏈設(shè)計(jì)模式介紹 抽象介紹 初次見面,了解表象,深入交流之后(看完文中的...
摘要:推文用設(shè)計(jì)模式解構(gòu)三國是一種什么體驗(yàn)行為型設(shè)計(jì)模式一策略模式工廠模式優(yōu)化結(jié)構(gòu)狀態(tài)模式隨著狀態(tài)改變而改變行為。推文狀態(tài)機(jī)與狀態(tài)模式責(zé)任鏈模式多個(gè)對(duì)象依次處理請(qǐng)求前者指定后者。代理模式代理針對(duì)一個(gè)對(duì)象,為了增加控制等中介雙方都是多個(gè),為了解耦。 策略模式 選擇使用封裝好的一系列算法,可相互替換。 類比:商店[Context]買完衣服買單[Stratege](現(xiàn)金[Concrete Stra...
閱讀 2829·2021-11-22 14:44
閱讀 574·2021-11-22 12:00
閱讀 3710·2019-08-30 15:54
閱讀 1606·2019-08-29 17:15
閱讀 1926·2019-08-29 13:50
閱讀 1144·2019-08-29 13:17
閱讀 3540·2019-08-29 13:05
閱讀 1203·2019-08-29 11:31