Chain of Responsibility 责任链模式 MD
責(zé)任鏈模式
簡介
責(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é)任鏈模式屏蔽了請(qǐng)求的處理過程,你發(fā)起一個(gè)請(qǐng)求到底是誰處理的,這個(gè)你不用關(guān)心,只要你把請(qǐng)求拋給責(zé)任鏈的第一個(gè)處理者,最終會(huì)返回一個(gè)處理結(jié)果(當(dāng)然也可以不做任何處理),作為請(qǐng)求者可以不用知道到底是需要誰來處理的,這是責(zé)任鏈模式的核心。
責(zé)任鏈就是從一個(gè)起點(diǎn)發(fā)起請(qǐng)求,然后沿著任務(wù)鏈依次傳遞給每一個(gè)節(jié)點(diǎn)上的對(duì)象,直到有一個(gè)節(jié)點(diǎn)處理這個(gè)請(qǐng)求為止。
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有對(duì)象處理它為止。
?
現(xiàn)實(shí)中最適合責(zé)任鏈的應(yīng)該就是部門領(lǐng)導(dǎo)之間的上報(bào)請(qǐng)求了。比如員工要申請(qǐng)一筆資金,會(huì)先向組長申請(qǐng),額度如果在組長的范圍內(nèi),組長就批了,組長權(quán)限不夠就向主管申請(qǐng),主管如果也額度不夠就向經(jīng)理申請(qǐng)。這就形成了個(gè)責(zé)任鏈。
組長,主管,經(jīng)理。每個(gè)人都是責(zé)任鏈上的一個(gè)節(jié)點(diǎn)。一個(gè)請(qǐng)求被層層轉(zhuǎn)達(dá),直到被處理或沒有一個(gè)人能處理。普通員工,就是那個(gè)申請(qǐng)的發(fā)起者,并不需要知道到底最后是誰審批的,他只要拿到錢就行了。這樣就造成了請(qǐng)求者和處理者的解耦。
?
責(zé)任鏈有一個(gè)缺點(diǎn)是,大家在開發(fā)的時(shí)候要注意,調(diào)試不是很方便,特別是鏈條比較長,環(huán)節(jié)比較多的時(shí)候,由于采用了類似遞歸的方式,調(diào)試的時(shí)候邏輯可能比較復(fù)雜。
適用性
- 有多個(gè)對(duì)象可以處理一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求在運(yùn)行時(shí)刻自動(dòng)確定。
- 在請(qǐng)求的處理者不明確的情況下,向多個(gè)對(duì)象的一個(gè)提交請(qǐng)求。
- 需要?jiǎng)討B(tài)指定一組對(duì)象處理請(qǐng)求。
角色
- Handler:抽象處理者角色,聲明一個(gè)處理請(qǐng)求的方法,并保持對(duì)下一個(gè)處理節(jié)點(diǎn)Handler對(duì)象的引用。
- ConcreteHandler: 具體的處理者,對(duì)請(qǐng)求進(jìn)行處理,如果不處理就講請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn)上的處理對(duì)象。
?
作用:請(qǐng)求會(huì)被鏈上的對(duì)象處理,但是客戶端不知道請(qǐng)求會(huì)被哪些對(duì)象處理
通過把請(qǐng)求從一個(gè)對(duì)象傳遞到鏈條中下一個(gè)對(duì)象的方式,直到請(qǐng)求被處理完畢,以實(shí)現(xiàn)對(duì)象間的解耦。
JDK中體現(xiàn):ClassLoader的委托模型
簡單版案例
抽象處理者:
1 public abstract class Handler { 2 protected Handler successor; 3 public abstract void handleRequest(String condition); 4 }
?
實(shí)際處理者1
public class ConcreteHandler1 extends Handler {@Overridepublic void handleRequest(String condition) {if ("ConcreteHandler1".equals(condition)){System.out.println("ConcreteHandler1 handled");}else {successor.handleRequest(condition);}} }
?
實(shí)際處理者2
public class ConcreteHandler2 extends Handler {@Overridepublic void handleRequest(String condition) {if ("ConcreteHandler2".equals(condition)) {System.out.println("ConcreteHandler2 handled");} else {successor.handleRequest(condition);}} }
?
客戶端調(diào)用,組成一條責(zé)任鏈
public class Client {public static void main(String[] args) {ConcreteHandler1 concreteHandler1 = new ConcreteHandler1();ConcreteHandler2 concreteHandler2 = new ConcreteHandler2();concreteHandler1.successor = concreteHandler2;concreteHandler2.successor = concreteHandler1;concreteHandler1.handleRequest("ConcreteHandler2");} }
?
簡單版中,傳遞的都是統(tǒng)一的字符串,處理也比較簡單。但是在實(shí)際開發(fā)中,責(zé)任鏈中的請(qǐng)求處理規(guī)則是不盡相同的,這種時(shí)候需要對(duì)請(qǐng)求進(jìn)行封裝,同時(shí)對(duì)請(qǐng)求的處理規(guī)則也進(jìn)行一個(gè)封裝,
?
復(fù)雜版案例
抽象處理者
public abstract class AbstractHandler {protected AbstractHandler nextHandler; ?public final void handleRequest(AbstractRequest request){if (request.getRequestLevel()==getHandleLevel()){handle(request);}else {if (nextHandler!=null){nextHandler.handleRequest(request);}else {System.out.println("沒有對(duì)象能處理這個(gè)請(qǐng)求");}}}protected abstract int getHandleLevel();protected abstract void handle(AbstractRequest request); }
?
三個(gè)處理者
public class Handler1 extends AbstractHandler {@Overrideprotected int getHandleLevel() {return 1;} ?@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler1處理了請(qǐng)求:"+request.getRequestLevel());} }
public class Handler2 extends AbstractHandler {@Overrideprotected int getHandleLevel() {return 2;} ?@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler2處理了請(qǐng)求:"+request.getRequestLevel());} }
public class Handler3 extends AbstractHandler {@Overrideprotected int getHandleLevel() {return 3;} ?@Overrideprotected void handle(AbstractRequest request) {System.out.println("Handler3處理了請(qǐng)求:"+request.getRequestLevel());} }
?
抽象請(qǐng)求者
public abstract class AbstractRequest {private Object obj;public AbstractRequest(Object obj){this.obj=obj;}public Object getContent(){return obj;}public abstract int getRequestLevel(); }
?
實(shí)現(xiàn)的三個(gè)請(qǐng)求
public class Request1 extends AbstractRequest {public Request1(Object obj) {super(obj);} ?@Overridepublic int getRequestLevel() {return 1;} } public class Request2 extends AbstractRequest {public Request2(Object obj) {super(obj);} ?@Overridepublic int getRequestLevel() {return 2;} } public class Request3 extends AbstractRequest {public Request3(Object obj) {super(obj);} ?@Overridepublic int getRequestLevel() {return 3;} }
?
客戶端調(diào)用
public class Client {public static void main(String[] args) {//構(gòu)造三個(gè)處理對(duì)象AbstractHandler handler1 = new Handler1();AbstractHandler handler2 = new Handler2();AbstractHandler handler3 = new Handler3();//串成一個(gè)責(zé)任鏈handler1.nextHandler = handler2;handler2.nextHandler = handler3;//構(gòu)造三個(gè)請(qǐng)求AbstractRequest request1 = new Request1("A");AbstractRequest request2 = new Request2("B");AbstractRequest request3 = new Request3("C"); ?handler1.handleRequest(request1);handler1.handleRequest(request2);handler1.handleRequest(request3);} }
?
實(shí)際案例
抽象的領(lǐng)導(dǎo)
public abstract class Leader {protected Leader nextLeader; ?public final void handleRequest(int money) {if (money < = getLimit()) {handle(money);} else {if (nextLeader != null) {nextLeader.handleRequest(money);} else {System.out.println(money + "沒人能批準(zhǔn)");}}} ?public abstract int getLimit(); ?public abstract void handle(int money); }
?
三個(gè)具體的領(lǐng)導(dǎo)
public class GroupLeader extends Leader {@Overridepublic int getLimit() {return 5000;} ?@Overridepublic void handle(int money) {System.out.println(money + "由組長批準(zhǔn)");} }public class Director extends Leader {@Overridepublic int getLimit() {return 10000;} ?@Overridepublic void handle(int money) {System.out.println(money + "由主管批準(zhǔn)");} }public class Manager extends Leader {@Overridepublic int getLimit() {return 20000;} ?@Overridepublic void handle(int money) {System.out.println(money + "由經(jīng)理批準(zhǔn)");} }
?
員工申請(qǐng):
public class Test {public static void main(String[] args) {Leader groupLeader = new GroupLeader();Leader director = new Director();Leader manager = new Manager();groupLeader.nextLeader = director;director.nextLeader = manager; ?groupLeader.handleRequest(4000);groupLeader.handleRequest(12000);groupLeader.handleRequest(30000);} }
?
2016-04-21
轉(zhuǎn)載于:https://www.cnblogs.com/baiqiantao/p/5417291.html
總結(jié)
以上是生活随笔為你收集整理的Chain of Responsibility 责任链模式 MD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京暖气费价钱是怎么计算的呢?
- 下一篇: JSON http://www