亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入淺出基于Java的責任鏈模式

2019-11-18 13:08:02
字體:
來源:轉載
供稿:網友

  一、引言
  
  初看責任鏈模式,心里不禁想起了一個以前聽過的相聲:看牙。說的是一個病人看牙的時候,醫生不小心把拔下的一個牙掉進了病人嗓子里。病人因此樓上樓下的跑了好多科室,最后無果而終。
  
  責任鏈模式就是這種“推卸”責任的模式,你的問題在我這里能解決我就解決,不行就把你推給另一個對象。至于到底誰解決了這個問題了呢?我管呢!
  
  二、定義與結構
  
  從名字上大概也能猜出這個模式的大概模樣——系統中將會存在多個有類似處理能力的對象。當一個請求觸發后,請求將在這些對象組成的鏈條中傳遞,直到找到最合適的“責任”對象,并進行處理。
  
  《設計模式》中給它的定義如下:使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
  
  從定義上可以看出,責任鏈模式的提出是為了“解耦”,以應變系統需求的變更和不明確性。
  
  下面是《設計模式》中給出的適用范圍:
  
  1) 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。
  
  2) 你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
  
  3) 可處理一個請求的對象集合應被動態指定。
  
  責任鏈模式真的能給發送者和接收者之間解耦(這似乎很神奇)嗎?先來看下它的組成角色。這個問題我會在下面提及。
  
  責任鏈模式由兩個角色組成:
  
  1) 抽象處理者角色(Handler):它定義了一個處理請求的接口。當然對于鏈子的不同實現,也可以在這個角色中實現后繼鏈。
  
  2) 具體處理者角色(Concrete Handler):實現抽象角色中定義的接口,并處理它所負責的請求。假如不能處理則訪問它的后繼者。
  
  至于類圖不放也罷。究竟就是一個繼續或者實現。
  
  三、純與不純
  
  責任鏈模式的純與不純的區別,就像黑貓、白貓的區別一樣。不要刻意的去使自己的代碼來符合一個模式的公式。只要能夠使代碼降低耦合、提高重用,滿足系統需求并能很好的適應變化就好了。正所謂:管它黑貓白貓,抓住老鼠就是好貓!
  
  純的責任鏈模式,規定一個具體處理者角色只能對請求作出兩種動作:自己處理;傳給下家。不能出現處理了一部分,把剩下的傳給了下家的情況。而且請求在責任鏈中必須被處理,而不能出現無果而終的結局。
  
  反之,則就是不純的責任鏈模式。
  
  不純的責任鏈模式還算是責任鏈模式嗎?比如一個請求被捕捉后,每個具體處理者都嘗試去處理它,不管結果如何都將請求再次轉發。我認為這種方式的實現,算不算是責任鏈模式的一種倒不重要,重要的是我們也能從中體味到責任鏈模式的思想:通過將多個處理者之間建立聯系,來達到請求與具體的某個處理者的解耦。
  
  下面的例子就是采用了上面提到的“不純的責任鏈模式”。
  
  四、舉例
  
  這個例子來源于項目中我剛剛完成的一個小功能點——“代號自動生成器”。在項目中存在很多地方,比如:員工工號、檔案代號,要求客戶在使用時輸入。而這些代號對于一個特定的企業或者類別,往往有一定的規則。因此可以讓用戶在系統參數中維護一定的規則,然后通過“代號自動生成器”來給用戶生成代號。
  
  根據初期需求,用戶代號中往往存在以下幾種變動元素:年份、月份、日期、流水號。由于需求比較簡單,因此考慮到用戶可能存在其他變動元素,所以我打算在“被第一顆子彈擊中”后重構一下現有的結構。下面就是我在頭腦中演繹過的使用責任鏈模式的重構。
  
  這里只用來說明下責任鏈模式的結構和使用,因此不體現功能細節。
  
  //這是抽象處理者角色
  
  public interface CodeAutoParse {
  
  //這里就是統一的處理請求使用的接口
  
  String[] generateCode(String moduleCode, int number, String rule,String[] target) throws BaseException;
  
  }
  
  //這個為處理日期使用的具體處理者
  
  public class DateAutoParse implements CodeAutoParse{
  
  //獲取當前時間
  
  PRivate final Calendar currentDate = Calendar.getInstance();
  
  //這里用來注入下一個處理者,系統中采用的是Spring來治理的
  
  private CodeAutoParse theNextParSEOfDate;
  public void setTheNextParseOfDate(CodeAutoParse theNextParseOfDate){
  this.theNextParseOfDate = theNextParseOfDate ;
  }
  
  /*
  *實現的處理請求的接口
  *這個接口首先判定用戶定義的格式是否有流水號,有則解析,沒有則跳過
  *下傳到下一個處理者
  */
  
  public String[] generateCode(String moduleCode, int number, String rule, String[] target)
  throws BaseException {
  //這里省略了處理的業務
  ……
  if(theNextParseOfDate != null)
  return theNextParseOfDate.generateCode(moduleCode , number , rule, target)
  else
  return target;
  }
  
  其它具體處理者也是如此的結構,每一個里面都設置有一個用來存放下一個處理者的引用,不管你有沒有下一個處理者。
  
  其實責任鏈模式本身的結構和使用都沒有什么,就是一個繼續或者實現。在處理請求的時候,按照規定去調用下一個處理者。但是怎么來維護這樣一條鏈子呢?
  
  《設計模式》一書中僅僅說必須自己引入它,可以參考使用list或者map來進行注冊。而在上面我使用spring來治理具體處理者角色的引入。當有了新的處理者需要添加的時候,僅僅需要修改下配置文件。
  
  五、其他
  
  責任鏈模式優點,上面已經體現出來了。無非就是降低了耦合、提高了靈活性。但是責任鏈模式可能會帶來一些額外的性能損耗,因為它要從鏈子開頭開始遍歷。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久久久久av| 亚洲欧美成人网| 欧美成人h版在线观看| 日韩天堂在线视频| 国产福利成人在线| 欧美精品videosex极品1| 人人做人人澡人人爽欧美| 国产成人久久精品| 久久九九全国免费精品观看| 国产日韩在线一区| 欧美精品第一页在线播放| 国产精品美女久久久久久免费| 久久精品男人天堂| 亚洲色图美腿丝袜| 色妞一区二区三区| 国产在线视频一区| 91久久精品美女高潮| 成人av番号网| 亚洲精品动漫100p| 亚洲国产精品人人爽夜夜爽| 久久天天躁狠狠躁夜夜躁| 国产精品久久77777| 久久久久久久国产精品视频| 川上优av一区二区线观看| 日本19禁啪啪免费观看www| 久久夜色精品国产欧美乱| 九九热这里只有精品免费看| 亚洲人成在线观看网站高清| 国产精品自产拍在线观| 成人av色在线观看| 一区三区二区视频| 日韩有码视频在线| 亚洲第一二三四五区| 日韩欧美国产中文字幕| 亚洲国产小视频| 欧美综合国产精品久久丁香| 欧美日韩国产成人高清视频| 色婷婷**av毛片一区| 亚洲成人免费网站| 亚洲mm色国产网站| 欧美老女人性生活| 色多多国产成人永久免费网站| 国产日韩欧美在线观看| 91欧美精品午夜性色福利在线| 亚洲欧美精品suv| 亚洲欧美日韩一区二区三区在线| 精品视频—区二区三区免费| 国产噜噜噜噜久久久久久久久| 国产成人jvid在线播放| 国产一区二区三区视频免费| 亚洲国产精品电影在线观看| 91久久精品美女高潮| 亚洲国产精彩中文乱码av| 国产香蕉97碰碰久久人人| 欧美成人精品在线| 日韩亚洲精品电影| 亚洲综合精品一区二区| 日韩高清不卡av| 国自产精品手机在线观看视频| 国产精品www| 国产视频福利一区| 91免费看片在线| 亚洲女人天堂网| 久久成人人人人精品欧| 欧美夫妻性生活视频| 欧美中文字幕在线观看| 国产一区二区三区视频免费| 欧美国产日韩精品| 国产精品亚发布| 97色在线视频观看| 欧美黑人国产人伦爽爽爽| 欧美在线视频观看| 97国产精品免费视频| 91中文在线视频| 亚洲二区中文字幕| 97人人模人人爽人人喊中文字| 亚洲美腿欧美激情另类| 尤物yw午夜国产精品视频明星| 欧美大片免费看| 欧美福利在线观看| 亚洲视频综合网| 亚洲欧美一区二区精品久久久| 一区二区欧美在线| 亚洲一区二区三区乱码aⅴ| 亚洲视屏在线播放| 深夜福利亚洲导航| 国产精品精品一区二区三区午夜版| 在线播放国产一区二区三区| 国产精品视频999| 欧美国产日韩在线| 77777少妇光屁股久久一区| 国产精品18久久久久久麻辣| 92看片淫黄大片欧美看国产片| 久久久久www| 亚洲一区二区三区四区视频| 97国产一区二区精品久久呦| 九九久久国产精品| 久久6免费高清热精品| 国产91精品青草社区| 国产亚洲精品久久久久久牛牛| 狠狠色香婷婷久久亚洲精品| 欧美日韩中文字幕在线视频| 欧美有码在线视频| 美日韩丰满少妇在线观看| 久久久这里只有精品视频| 成人激情视频小说免费下载| 亚洲a一级视频| 国产精品偷伦一区二区| 亚洲精品www久久久久久广东| 国内精品一区二区三区四区| 欧美激情中文字幕在线| 欧美一级黑人aaaaaaa做受| 国产丝袜一区视频在线观看| 5566成人精品视频免费| 久久国产一区二区三区| 欧美性猛交xxxxx水多| 亚洲bt欧美bt日本bt| 国产日韩av在线| 久99九色视频在线观看| 亚洲香蕉av在线一区二区三区| 中文字幕av一区二区三区谷原希美| 2021久久精品国产99国产精品| 国产精品久久久久久久av电影| 亚洲另类图片色| 欧美一级淫片丝袜脚交| 成人啪啪免费看| 91在线观看免费观看| 国内精品小视频在线观看| 久久久久久久久久久国产| 91精品国产九九九久久久亚洲| 久久久久久91香蕉国产| 亚洲一区二区三区在线视频| 91成人免费观看网站| 日韩av在线网址| 日韩美女毛茸茸| 26uuu另类亚洲欧美日本一| 成人免费黄色网| 国产99在线|中文| 久热精品视频在线免费观看| 毛片精品免费在线观看| 欧美黄色三级网站| 色爱精品视频一区| 91在线观看免费高清完整版在线观看| 亚洲激情在线观看视频免费| 欧美伦理91i| 国产91亚洲精品| 欧美国产日韩中文字幕在线| 国产男女猛烈无遮挡91| 亚洲精品国产综合区久久久久久久| 国产精品福利网站| 久久久久久香蕉网| 91免费在线视频网站| 日韩在线免费av| 国产精品欧美激情| 国产精品嫩草视频| 亚洲成人黄色在线观看| 久久精品国产综合| 国产91精品久久久久| 日韩精品小视频| 国产在线播放不卡| 日韩经典中文字幕| 欧美电影在线观看完整版| 国产成人精品在线视频| 久久亚洲综合国产精品99麻豆精品福利|