Java設計模式——責任鏈模式(Chain of Responsibility)
責任鏈
責任鏈模式通俗來說就是關聯一串能夠處理事務的物件,使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。【view事件處理】【okhttp interceptors】
- 【抽象處理者】Handler : 定義出一個處理請求的介面,抽象方法
handleRequest()
規範子類處理請求的操作。 - 【具體處理者】ConcreteHandler : 具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。
- 【客戶端】Client : 設定不同的具體處理者的層級。
結構類圖
舉例【周杰倫事務的責任鏈】
周杰倫每天都要接收到成千上萬個郵件,其中還包括一些垃圾郵件,比如什麼房地產啊,英語啊,健身的。除了完了垃圾郵件,剩下的郵件再由經紀人進行篩選,經紀人不能處理的郵件轉由方文山去處理,同理,如果是作詞相關的資訊就由方文山來處理,最後剩下的再發給周杰倫(周杰倫也可以不處理)
- 【智慧機器管家】 : 處理無用的垃圾郵件
- 【大妮】 : 處理負面新聞
- 【方文山】 : 御用文人,執筆寫歌詞
- 【周杰倫】 : 如果前面幾個人都沒有解決,就由自己處理該郵件。【自己也可以不處理】
抽象Handler
定義規範
public abstract class Handler {
private Handler successor;
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
abstract Response handlerRequest(String msgChain);
}
大佬們處理的“郵件”Response
public class Response {
public Response(String msg, String dealMan) {
this.msg = msg;
this.dealMan = dealMan;
}
private String msg;
private String dealMan;
public String getMsg() {
return msg;
}
public String getDealMan() {
return dealMan;
}
}
【處理垃圾資訊的管家】
public class RubbishHandler extends Handler {
@Override
Response handlerRequest(String msgChain) {
if (msgChain.contains("安利") || msgChain.contains("健身嗎靚仔") || msgChain.contains("信用卡辦理")) {
return new Response("清空垃圾資訊", "智慧機器管家");
} else {
return getSuccessor().handlerRequest(msgChain);
}
}
}
【處理負面新聞的大妮】
public class NegativeHanlder extends Handler {
@Override
Response handlerRequest(String msgChain) {
if (msgChain.contains("卓偉") || msgChain.contains("趙五兒") || msgChain.contains("宋祖德")) {
return new Response("馬上拿1000萬封口費", "大妮");
} else {
return getSuccessor().handlerRequest(msgChain);
}
}
}
【御用創作文人方文山】
public class TalentedHanlder extends Handler {
@Override
Response handlerRequest(String msgChain) {
if (msgChain.contains("張惠妹") || msgChain.contains("林夕") || msgChain.contains("張學友")) {
return new Response("執筆寫歌詞", "方文山");
} else {
return getSuccessor().handlerRequest(msgChain);
}
}
}
【周杰倫親自出馬】
public class JayHanlder extends Handler {
@Override
Response handlerRequest(String msgChain) {
return new Response("媳婦,別鬧", "周杰倫");
}
}
看一下客戶端的處理
Handler rubbishHandler = new RubbishHandler();//建立Handler例項
Handler negativeHanlder = new NegativeHanlder();
Handler talentedHanlder = new TalentedHanlder();
Handler jayHanlder = new JayHanlder();
rubbishHandler.setSuccessor(negativeHanlder);//然後關聯層級
negativeHanlder.setSuccessor(talentedHanlder);
talentedHanlder.setSuccessor(jayHanlder);
Response response_new = rubbishHandler.handlerRequest("周杰倫先生你好,我是卓偉,我這邊有一張侯佩琴的...");
System.out.println(response_new.getDealMan() + "【處理了該事件】" + response_new.getMsg());
Response response_new2 = rubbishHandler.handlerRequest("昆凌說老周啊,該生三胎了啊");
System.out.println(response_new2.getDealMan() + "【處理了該事件】" + response_new2.getMsg());
總結
責任鏈模式其實就是一個靈活版的if…else…語句,它就是將這些判定條件的語句放到了各個處理類中
責任鏈優點
- 解耦請求者和傳送者。
- 簡化具體責任物件,因為它不知道鏈的結構,只要處理自己對應的工作即可。
- 可以動態的增加或者刪除責任物件。
責任鏈缺點
- 並不能保證請求一定會被執行,可能落到鏈尾之外【可以是優點也可以是缺點】
- 如果出錯,不太容易除錯。可能需要到每個具體的責任物件一 一排查。
- 一個責任鏈需要整個具體責任鏈物件遍歷,然後設定不同的層級。
相關推薦
設計模式——責任鏈(Chain of Responsibility)
責任鏈模式 為 設計模式的 行為型模式的一種. #責任鏈最常見的舉例是 申請費用: 程式猿 申請出差費用 (由於各位領導的審批額度有限,需要逐層審批):小組長—>專案經理—>部門經理—>Boss(小組長髮現額度過大,小組長向專案
重走Java設計模式——責任鏈模式(Chain of Responsibility Pattern)
責任鏈模式 定義 使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係,將這些物件連結成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。 程式碼示例 我們建立抽象類AbstractLogger,帶有詳細的日誌記錄級別。然後我們建立三
【java設計模式】之 責任鏈(chain of resposibility)模式
責任鏈模式,顧名思義,就是一條鏈。這個鏈到底是怎麼執行的呢?它主要是將能夠處理同一類請求的物件連成一條鏈,所提交的請求沿著鏈傳遞,鏈上的物件逐個判斷是否有能力處理該請求,如果能則處理,如果不能則
Java設計模式——責任鏈模式(Chain of Responsibility)
責任鏈 責任鏈模式通俗來說就是關聯一串能夠處理事務的物件,使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。【view事件處理】【okhttp interceptors
設計模式(一)Chain Of Responsibility責任鏈模式(未完成)
設計模式篇章,源於網課的學習,以及個人的整理 在我們接收使用者提交的字元時,常常會使用到過濾,在學習責任鏈模式前,我們是這樣做的 1.定義一個類 public class MsgProcesser { String msg; public MsgProce
設計模式-責任鏈模式Chain of Responsibility)
一、定義 職責鏈模式是一種物件的行為模式。在職責鏈模式裡,很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織鏈和分配責任。
設計模式(行為型模式) ----- 責任鏈模式(Chain of Responsibility)
有多個物件,每個物件持有對下一個物件的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求。但是發出者並不清楚到底最終那個物件會處理該請求,所以,責任鏈模式可以實現,在隱瞞客戶端的情況下,對系統進行動態的調整。先看看關係圖: Abstr
C#設計模式-責任鏈模式(Chain of Responsibility Pattern)
引子 一個事件需要經過多個物件處理是一個挺常見的場景,譬如採購審批流程,請假流程,軟體開發中的異常處理流程,web請求處理流程等各種各樣的流程,可以考慮使用責任鏈模式來實現。現在以請假流程為例,一般公司普通員工的請假流程簡化如下:普通員工發起一個請假申請,當請假天數小於3天時只需要得到主管批准即可;當請假天數
java 設計模式 -- 責任鏈模式
ddc 結果 fun intercept lock -s xtend print blog 設計模式 – 責任鏈模式 介紹: 責任鏈模式是一種動態行為模式,有多個對象,每一個對象分別擁有其下家的引用。連起來形成一條鏈。待處理對象則傳到此鏈上
設計模式的征途—14.職責鏈(Chain of Responsibility)模式
and 問題 調試 決定 tor 客戶端 edi toa 發送 相信大家都玩過類似於“鬥地主”的紙牌遊戲,某人出牌給他的下家,下家看看手中的牌,如果要不起,則將出牌請求轉發給他的下家,其下家再進行判斷。一個循環下來,如果其他人都要不起該牌,則最初的出
我的Java設計模式-責任鏈模式
設計模式 Android Java 今天來說說程序員小猿和產品就關於需求發生的故事。前不久,小猿收到了產品的需求。產品經理:小猿,為了迎合大眾屌絲用戶的口味,我們要放一張圖,要露點的。小猿:......露點?你大爺的,讓身為正義與純潔化身的我做這種需求,還露點。產品經理:誤會誤會,是放一張暴露一點
Java設計模式-責任鏈模式
對象行為型模式 結束 PE 缺點 滿足 repl top 調用 規則 責任鏈模式又稱為職責鏈模式,在23種設計模式中歸類為行為型模式。行為型模式可以分為類行為型模式和對象行為型模式。 類行為型模式使用繼承關系在幾個類之間分配行為,類行為型模式主要通過多態等方式來分配父類與子
從原始碼角度理解Java設計模式--責任鏈模式
本文內容思維導圖如下:
Java設計模式—責任鏈模式
責任鏈模式的定義: 使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。 責任鏈模式的重點是在“鏈”上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回相
java設計模式:責任鏈模式
責任鏈模式 將接收者物件連成一條鏈,並在該鏈上傳遞請求,直到有一個接收者物件處理他,通過讓更多物件有機會處理請求,避免了請求傳送者和接收者之間的耦合。 下面通過一個生活中的事例比如“申請折扣”來說明責任鏈模式。 你去買房子或買車,全款買的,所以想申請一個折扣,如果只是5
Java設計模式----責任鏈模式
簡述: 前端時間再看一些類庫的原始碼,發現責任鏈模式的強大之處,尤其是和建造者模式的結合後強大的動態可擴充套件性更是牛逼的一塌糊塗。接下來趕緊了解一下吧! 我們先來了解一下什麼是責任鏈模式: 職責鏈模式(Chain of Responsibil
設計模式—責任鏈模式
[] .com repl ring replace servlet 就業 返回 array 責任鏈將處理請求在鏈條的節點上傳遞,每到一個節點可被處理或者也可不被處理。 典型的是在servlet中過濾器filter的的處理方式。當request請求或者response請求時,
設計模式——責任鏈模式
IT ger bst student AR down OS 分享圖片 我們 背景: 想必獎學金大家都不陌生,在學校裏獎學金往往分為三種班獎學金、院級獎學金以及校級獎學金,但是我們往往苦於政策修改,不知道自己的獎學金該找誰領,於是乎就詢問順序就是:班級輔導員->學院老師
Groovy 設計模式 -- 責任鏈模式
IT class att lin Language cti efault make each Chain of Responsibility Pattern http://groovy-lang.org/design-patterns.html#_chain_of_res
設計模式-責任鏈模式在實際項目中的使用
模式 getc erro build strac orm collected pack server 最近一次叠代,參與了公司數據應用平臺的開發,其中負責的一塊功能早早的就完成了代碼的編寫工作,即將進入測試階段,因為有時間思考和總結代碼編寫中遇到的難題,便想著將代碼做一