《java设计模式》之责任链模式
在閻宏博士的《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é)任。
在以下條件下可考慮使用Chain of Responsibility:
1 有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定。
2 你想在不明確指定接受者的情況下,想過個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。
3 可處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)該被動(dòng)態(tài)指定。
?
一個(gè)簡(jiǎn)單的例子:
1 abstract class Handler { 2 3 private Handler nextHandler; 4 5 public Handler getNextHandler() { 6 return nextHandler; 7 } 8 9 public void setNextHandler(Handler nextHandler) { 10 this.nextHandler = nextHandler; 11 } 12 13 public abstract void doHandler(); 14 15 } 16 17 class ConcreteHandler extends Handler { 18 19 @Override 20 public void doHandler() { 21 22 if (getNextHandler() != null) { 23 24 System.out.println("還有責(zé)任鏈"); 25 getNextHandler().doHandler(); 26 } else { 27 28 System.out.println("我自己處理" + toString()); 29 } 30 31 } 32 }?既然為設(shè)計(jì)模式,必然有其鮮明代碼的主體框架,我們來分析下
首先定義一個(gè)抽象的處理角色Handler ,其次是具體實(shí)現(xiàn)類ConcreteHandler ,在ConcreteHandler 我們通過getNextHandler()來判斷是否還有下一個(gè)責(zé)任鏈,如果有,則繼續(xù)
傳遞下去,調(diào)用getNextHandler().doHandler()來實(shí)現(xiàn)。
分析了簡(jiǎn)單的責(zé)任鏈模式的代碼框架之后,我們接下來給代碼加點(diǎn)實(shí)際的功能,舉個(gè)很簡(jiǎn)單的例子,就是報(bào)銷流程,項(xiàng)目經(jīng)理<部門經(jīng)理<總經(jīng)理
其中項(xiàng)目經(jīng)理報(bào)銷額度不能大于500,則部門經(jīng)理的報(bào)銷額度是不大于1000,超過1000則需要總經(jīng)理審核
1 abstract class ConsumeHandler { 2 3 private ConsumeHandler nextHandler; 4 5 public ConsumeHandler getNextHandler() { 6 return nextHandler; 7 } 8 9 public void setNextHandler(ConsumeHandler nextHandler) { 10 this.nextHandler = nextHandler; 11 } 12 13 /** user申請(qǐng)人 free報(bào)銷費(fèi)用 */ 14 public abstract void doHandler(String user, double free); 15 16 } 17 //項(xiàng)目經(jīng)理 18 class ProjectHandler extends ConsumeHandler { 19 20 @Override 21 public void doHandler(String user, double free) { 22 if (free < 500) { 23 24 if (user.equals("lwx")) { 25 System.out.println("給予報(bào)銷:" + free); 26 } else { 27 System.out.println("報(bào)銷不通過"); 28 } 29 30 } else { 31 if (getNextHandler() != null) { 32 33 getNextHandler().doHandler(user, free); 34 } 35 } 36 37 } 38 } 39 //部門經(jīng)理 40 class DeptHandler extends ConsumeHandler { 41 42 @Override 43 public void doHandler(String user, double free) { 44 if (free < 1000) { 45 46 if (user.equals("zy")) { 47 System.out.println("給予報(bào)銷:" + free); 48 } else { 49 System.out.println("報(bào)銷不通過"); 50 } 51 52 } else { 53 if (getNextHandler() != null) { 54 55 getNextHandler().doHandler(user, free); 56 } 57 } 58 59 } 60 } 61 //總經(jīng)理 62 class GeneralHandler extends ConsumeHandler { 63 64 @Override 65 public void doHandler(String user, double free) { 66 if (free >=1000) { 67 68 if (user.equals("lwxzy")) { 69 System.out.println("給予報(bào)銷:" + free); 70 } else { 71 System.out.println("報(bào)銷不通過"); 72 } 73 74 } else { 75 if (getNextHandler() != null) { 76 77 getNextHandler().doHandler(user, free); 78 } 79 } 80 81 } 82 }測(cè)試下
1 public static void main(String[] args) { 2 3 /*ConcreteHandler handler1 = new ConcreteHandler(); 4 ConcreteHandler handler2 = new ConcreteHandler(); 5 handler1.setNextHandler(handler2); 6 handler1.doHandler();*/ 7 8 ProjectHandler projectHandler =new ProjectHandler(); 9 DeptHandler deptHandler =new DeptHandler(); 10 GeneralHandler generalHandler =new GeneralHandler(); 11 projectHandler.setNextHandler(deptHandler); 12 deptHandler.setNextHandler(generalHandler); 13 projectHandler.doHandler("lwx", 450); 14 projectHandler.doHandler("lwx", 600); 15 projectHandler.doHandler("zy", 600); 16 projectHandler.doHandler("zy", 1500); 17 projectHandler.doHandler("lwxzy", 1500); 18 }執(zhí)行結(jié)果
給予報(bào)銷:450.0
報(bào)銷不通過
給予報(bào)銷:600.0
報(bào)銷不通過
給予報(bào)銷:1500.0
拓展聯(lián)想:模擬實(shí)現(xiàn)servlet過濾器中字符和登陸過濾器的實(shí)現(xiàn)
關(guān)于tomcat中責(zé)任鏈的使用:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/draem0507/p/3784130.html
總結(jié)
以上是生活随笔為你收集整理的《java设计模式》之责任链模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android应用开发中的风格和主题(s
- 下一篇: WPF指南之XAML概述