摘要:責任鏈模式涉及到的角色如下所示抽象處理者角色定義一個處理請求的抽象類。如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。一般來說,日常開發中不純的責任鏈模式用的比較多一點。參考責任鏈模式更多文章
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述責任鏈(Chain of Responsibility)模式的:
責任鏈模式是一種對象的行為模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端并不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
責任鏈模式涉及到的角色如下所示:
抽象處理者(Handler)角色:定義一個處理請求的抽象類。如果需要,可以定義一個方法以設定和返回對下家的引用。
具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由于具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。
舉一個簡單的例子,部門辦活動需要報銷。報銷處職員可以處理單次500元以下的業務,超過500需要和處長聯系。而處長只能處理單次1000元一下的業務,再高就只能找老大報了。但是老大目前只能處理單次1500元以下的業務,再高目前只能拒絕報銷了。
這個例子的具體實現為:
抽象類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); } }
最后的結果就是:
純責任鏈模式和不純的責任鏈模式
如果一個類要么承擔責任處理請求要么將請求踢給下一個皮球,則被稱為純責任鏈模式。
如果一個類承擔了一部分責任,還將請求踢給下一個皮球,則被稱為不純的責任鏈模式。
一般來說,日常開發中不純的責任鏈模式用的比較多一點。
參考:
java責任鏈模式
更多文章:http://blog.gavinzh.com
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65554.html
摘要:簡介職責鏈模式有時候也叫責任鏈模式,它是一種對象行為的設計模式。中的就是使用了責任鏈模式。純的責任鏈模式的實際例子很難找到,一般看到的例子均是不純的責任鏈模式的實現。如果堅持責任鏈不純便不是責任鏈模式,那么責任鏈模式便不會有太大意義了。 Java設計模式之職責鏈模式 前幾天復習java的異常處理時,接觸到了責任鏈模式。在企業級應用中,從前臺發過來的請求在后臺拋出異常,異常處理的設計一般...
摘要:責任鏈模式的具體運用以及原理請參見筆者責任鏈模式改進方式引入適配器模式關于接口適配器模式原理以及使用場景請參見筆者適配器模式。 1 責任鏈模式現存缺點 由于責任鏈大多數都是不純的情況,本案例中,只要校驗失敗就直接返回,不繼續處理接下去責任鏈中的其他校驗邏輯了,故而出現如果某個部分邏輯是要由多個校驗器組成一個整理的校驗邏輯的話,則此責任鏈模式則顯現出了它的不足之處了。(責任鏈模式的具體運...
世界上最遙遠的距離,不是生與死,而是它從你的世界路過無數次,你卻選擇視而不見,你無情,你冷酷啊...... showImg(https://segmentfault.com/img/remote/1460000019550563); 被你忽略的就是責任鏈設計模式,希望它再次經過你身旁你會猛的發現,并對它微微一笑...... 責任鏈設計模式介紹 抽象介紹 初次見面,了解表象,深入交流之后(看完文中的...
摘要:推文用設計模式解構三國是一種什么體驗行為型設計模式一策略模式工廠模式優化結構狀態模式隨著狀態改變而改變行為。推文狀態機與狀態模式責任鏈模式多個對象依次處理請求前者指定后者。代理模式代理針對一個對象,為了增加控制等中介雙方都是多個,為了解耦。 策略模式 選擇使用封裝好的一系列算法,可相互替換。 類比:商店[Context]買完衣服買單[Stratege](現金[Concrete Stra...
閱讀 2800·2021-11-22 14:44
閱讀 541·2021-11-22 12:00
閱讀 3683·2019-08-30 15:54
閱讀 1570·2019-08-29 17:15
閱讀 1898·2019-08-29 13:50
閱讀 1107·2019-08-29 13:17
閱讀 3513·2019-08-29 13:05
閱讀 1181·2019-08-29 11:31