2019-10-29 設計模式之責任鏈模式

WeChat Image_20191029230603.png

'''
/**

  • @author yangshaojun
  • @title GatewayController
  • @date 2019/10/29
  • @description 網(wǎng)關Controller
  • @version: v1.0
    */
    @RestController
    public class GatewayController {
    @GetMapping("/clientGateway")
    public String clientGateway() {
    CurrentLimitHandler currentLimitHandler = FactoryHandler.getFirstGatewayHandler();
    currentLimitHandler.service();
    return "success";
    }
    }
    '''

'''
/**

  • @author yangshaojun

  • @title FactoryHandler

  • @date 2019/10/29

  • @description 工廠工具類

  • @version: v1.0
    */
    public class FactoryHandler {
    public static CurrentLimitHandler getFirstGatewayHandler() {
    CurrentLimitHandler currentLimitHandler = new CurrentLimitHandler();

     BlackListHandler blackListHandler = new BlackListHandler();
     currentLimitHandler.setNextGatewayHandler(blackListHandler);
    
     ConversationHandler conversationHandler = new ConversationHandler();
     blackListHandler.setNextGatewayHandler(conversationHandler);
    
     return currentLimitHandler;
    

    }
    }
    '''
    '''
    /**

  • @author yangshaojun

  • @title GatewayHandler

  • @date 2019/10/29

  • @description 網(wǎng)關抽象類定義公共行為

  • @version: v1.0
    */
    public abstract class GatewayHandler {

    public GatewayHandler nextGatewayHandler;

    public abstract void service();

    public void setNextGatewayHandler(GatewayHandler gatewayHandler) {
    this.nextGatewayHandler = gatewayHandler;
    }

    public void nextService() {
    if (nextGatewayHandler != null) {
    nextGatewayHandler.service();
    }
    }
    }
    '''
    '''
    /**

  • @author yangshaojun

  • @title CurrentLimitHandler

  • @date 2019/10/29

  • @description API限流判斷

  • @version: v1.0
    */
    @Component
    public class CurrentLimitHandler extends GatewayHandler {

    @Override
    public void service() {
    System.out.println("第一關 >> API限流判斷");
    nextService();
    }
    }
    '''
    '''
    /**

  • @author yangshaojun

  • @title BlacklistHandler

  • @date 2019/10/29

  • @description 黑名單攔截

  • @version: v1.0
    */
    @Component
    public class BlackListHandler extends GatewayHandler {

    @Override
    public void service() {
    System.out.println("第二關 >> 黑名單攔截判斷");
    nextService();
    }
    }
    '''
    '''
    /**

  • @author yangshaojun

  • @title ConversationHandler

  • @date 2019/10/29

  • @description 用戶會話攔截

  • @version: v1.0
    */
    @Component
    public class ConversationHandler extends GatewayHandler {

    @Override
    public void service() {
    System.out.println("第三關 >> 用戶會話攔截判斷");
    }
    }
    '''

1.什么是責任鏈模式

   客戶端發(fā)出一個請求屠橄,鏈上的對象都有機會來處理這一請求侈百,而客戶端不需要知道誰是具體的處理對象糙俗。這樣就實現(xiàn)了請求者和接受者之間的解耦篙螟,并且在客戶端可以實現(xiàn)動態(tài)的組合職責鏈洒嗤。使編程更有靈活性坯临。

定義:使多個對象都有機會處理請求霍殴,從而避免了請求的發(fā)送者和接受者之間的耦合關系涮帘。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求贬芥,直到有對象處理它為止吐辙。其過程實際上是一個遞歸調用。

要點主要是:
1蘸劈、有多個對象共同對一個任務進行處理昏苏。
2、這些對象使用鏈式存儲結構威沫,形成一個鏈贤惯,每個對象知道自己的下一個對象。
3棒掠、一個對象對任務進行處理孵构,可以添加一些操作后將對象傳遞個下一個任務。也可以在此對象上結束任務的處理烟很,并結束任務颈墅。
4、客戶端負責組裝鏈式結構雾袱,但是客戶端不需要關心最終是誰來處理了任務恤筛。

2.責任鏈模式類結構圖
1.抽象處理者(Handler)角色:定義出一個處理請求的接口。如果需要芹橡,接口可以定義 出一個方法以設定和返回對下家的引用叹俏。這個角色通常由一個Java抽象類或者Java接口實現(xiàn)。上圖中Handler類的聚合關系給出了具體子類對下家的引用僻族,抽象方法handleRequest()規(guī)范了子類處理請求的操作。
 2.具體處理者(ConcreteHandler)角色:具體處理者接到請求后屡谐,可以選擇將請求處理掉述么,或者將請求傳給下家。由于具體處理者持有對下家的引用愕掏,因此度秘,如果需要,具體處理者可以訪問下家饵撑。

3.責任鏈模式優(yōu)缺點
優(yōu)點:
職責鏈模式的最主要功能就是:動態(tài)組合剑梳,請求者和接受者解耦。
請求者和接受者松散耦合:請求者不需要知道接受者滑潘,也不需要知道如何處理垢乙。每個職責對象只負責自己的職責范圍,其他的交給后繼者语卤。各個組件間完全解耦追逮。
動態(tài)組合職責:職責鏈模式會把功能分散到單獨的職責對象中酪刀,然后在使用時動態(tài)的組合形成鏈,從而可以靈活的分配職責對象钮孵,也可以靈活的添加改變對象職責骂倘。

缺點:
產(chǎn)生很多細粒度的對象:因為功能處理都分散到了單獨的職責對象中,每個對象功能單一巴席,要把整個流程處理完历涝,需要很多的職責對象,會產(chǎn)生大量的細粒度職責對象漾唉。
不一定能處理:每個職責對象都只負責自己的部分荧库,這樣就可以出現(xiàn)某個請求,即使把整個鏈走完毡证,都沒有職責對象處理它电爹。這就需要提供默認處理,并且注意構造鏈的有效性料睛。

4.責任鏈模式應用場景
1.多條件流程判斷 權限控制
2.ERP系統(tǒng) 流程審批 總經(jīng)理丐箩、人事經(jīng)理、項目經(jīng)理
3.Java過濾器的底層實現(xiàn)Filter
比如:在Java過濾器中客戶端發(fā)送請求到服務器端恤煞,過濾會經(jīng)過參數(shù)過濾屎勘、session過濾、表單過濾居扒、隱藏過濾概漱、檢測請求頭過濾

5.網(wǎng)關權限控制責任鏈模式

在網(wǎng)關作為微服務程序的入口,攔截客戶端所有的請求實現(xiàn)權限控制 喜喂,比如先判斷Api接口限流瓤摧、黑名單、用戶會話玉吁、參數(shù)過濾照弥。
Api接口限流→黑名單攔截→用戶會話。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末进副,一起剝皮案震驚了整個濱河市这揣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌影斑,老刑警劉巖给赞,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矫户,居然都是意外死亡片迅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門皆辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來障涯,“玉大人罐旗,你說我怎么就攤上這事∥ǖ” “怎么了九秀?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粘我。 經(jīng)常有香客問我鼓蜒,道長,這世上最難降的妖魔是什么征字? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任都弹,我火速辦了婚禮,結果婚禮上匙姜,老公的妹妹穿的比我還像新娘畅厢。我一直安慰自己,他們只是感情好氮昧,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布框杜。 她就那樣靜靜地躺著,像睡著了一般袖肥。 火紅的嫁衣襯著肌膚如雪咪辱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天椎组,我揣著相機與錄音油狂,去河邊找鬼。 笑死寸癌,一個胖子當著我的面吹牛专筷,可吹牛的內容都是我干的。 我是一名探鬼主播蒸苇,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磷蛹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了填渠?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鸟辅,失蹤者是張志新(化名)和其女友劉穎氛什,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匪凉,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡枪眉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了再层。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贸铜。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堡纬,死狀恐怖,靈堂內的尸體忽然破棺而出蒿秦,到底是詐尸還是另有隱情烤镐,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布棍鳖,位于F島的核電站炮叶,受9級特大地震影響,放射性物質發(fā)生泄漏渡处。R本人自食惡果不足惜镜悉,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望医瘫。 院中可真熱鬧侣肄,春花似錦、人聲如沸醇份。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽被芳。三九已至缰贝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畔濒,已是汗流浹背剩晴。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侵状,地道東北人赞弥。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像趣兄,于是被迫代替她去往敵國和親绽左。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容

  • 1.初識職責鏈模式 使多個對象都有機會處理請求艇潭,從而避免請求的發(fā)送者和接收者之間的耦合關系拼窥。將這些對象連成一條鏈,...
    王偵閱讀 800評論 0 1
  • 所選依賴: 工具類:一蹋凝、 package com.xxx.core.util.push.enums; /** 配置...
    Y_LY閱讀 1,882評論 0 2
  • 責任鏈模式CoR (Chain of Responsibility) 概述 責任鏈模式是一種設計模式鲁纠。在責任鏈模式...
    n油炸小朋友閱讀 1,997評論 0 4
  • 感謝我的好朋友把我?guī)нM了易效能的課堂改含,最初的目的很簡單:想讓自己從忙亂的生活,到充實而不亂的生活迄汛。想要的只...
    _相逢一笑_閱讀 303評論 0 1
  • 你低頭捍壤,十里桃花落骤视,云霞萬里長 你綻笑,樂府鼓弦商鹃觉,瓊片隨風揚 你看向我专酗,忽而天晴,忽而云散帜慢,忽而今朝雷霆做鼓樂笼裳,...
    田jing閱讀 211評論 0 0