日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Chain of Responsibility 责任链模式 MD

發(fā)布時(shí)間:2023/11/27 生活经验 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Chain of Responsibility 责任链模式 MD 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

責(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。