偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

深入淺出基于Java的責(zé)任鏈模式

開發(fā) 后端
在Java中使用責(zé)任鏈模式可以有效降低耦合、提高靈活性。本文簡單介紹基于Java的責(zé)任鏈模式,并對責(zé)任鏈模式的兩個角色做了簡單介紹。

一、引言

初看責(zé)任鏈模式,心里不禁想起了一個以前聽過的相聲:看牙。說的是一個病人看牙的時候,醫(yī)生不小心把拔下的一個牙掉進了病人嗓子里。病人因此樓上樓下的跑了好多科室,最后無果而終。

責(zé)任鏈模式就是這種“推卸”責(zé)任的模式,你的問題在我這里能解決我就解決,不行就把你推給另一個對象。至于到底誰解決了這個問題了呢?我管呢!

二、定義與結(jié)構(gòu)

從名字上大概也能猜出這個模式的大概模樣——系統(tǒng)中將會存在多個有類似處理能力的對象。當(dāng)一個請求觸發(fā)后,請求將在這些對象組成的鏈條中傳遞,直到找到最合適的“責(zé)任”對象,并進行處理。

《設(shè)計模式》中給它的定義如下:使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

從定義上可以看出,責(zé)任鏈模式的提出是為了“解耦”,以應(yīng)變系統(tǒng)需求的變更和不明確性。

下面是《設(shè)計模式》中給出的適用范圍:

1) 有多個的對象可以處理一個請求,哪個對象處理該請求運行時刻自動確定。

2) 你想在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。

3) 可處理一個請求的對象集合應(yīng)被動態(tài)指定。

責(zé)任鏈模式真的能給發(fā)送者和接收者之間解耦(這好像很神奇)嗎?先來看下它的組成角色。這個問題我會在下面提及。

責(zé)任鏈模式由兩個角色組成:

1) 抽象處理者角色(Handler):它定義了一個處理請求的接口。當(dāng)然對于鏈子的不同實現(xiàn),也可以在這個角色中實現(xiàn)后繼鏈。

2) 具體處理者角色(Concrete Handler):實現(xiàn)抽象角色中定義的接口,并處理它所負責(zé)的請求。如果不能處理則訪問它的后繼者。

至于類圖不放也罷。畢竟就是一個繼承或者實現(xiàn)。

三、純與不純

責(zé)任鏈模式的純與不純的區(qū)別,就像黑貓、白貓的區(qū)別一樣。不要刻意的去使自己的代碼來符合一個模式的公式。只要能夠使代碼降低耦合、提高重用,滿足系統(tǒng)需求并能很好的適應(yīng)變化就好了。正所謂:管它黑貓白貓,抓住老鼠就是好貓!

純的責(zé)任鏈模式,規(guī)定一個具體處理者角色只能對請求作出兩種動作:自己處理;傳給下家。不能出現(xiàn)處理了一部分,把剩下的傳給了下家的情況。而且請求在責(zé)任鏈中必須被處理,而不能出現(xiàn)無果而終的結(jié)局。

反之,則就是不純的責(zé)任鏈模式。

不純的責(zé)任鏈模式還算是責(zé)任鏈模式嗎?比如一個請求被捕獲后,每個具體處理者都嘗試去處理它,不管結(jié)果如何都將請求再次轉(zhuǎn)發(fā)。我認為這種方式的實現(xiàn),算不算是責(zé)任鏈模式的一種倒不重要,重要的是我們也能從中體味到責(zé)任鏈模式的思想:通過將多個處理者之間建立聯(lián)系,來達到請求與具體的某個處理者的解耦。

#p#

下面的例子就是采用了上面提到的“不純的責(zé)任鏈模式”。

四、舉例

這個例子來源于項目中我剛剛完成的一個小功能點——“代號自動生成器”。在項目中存在很多地方,比如:員工工號、檔案代號,要求客戶在使用時輸入。而這些代號對于一個特定的企業(yè)或者類別,往往有一定的規(guī)則。因此可以讓用戶在系統(tǒng)參數(shù)中維護一定的規(guī)則,然后通過“代號自動生成器”來給用戶生成代號。

根據(jù)初期需求,用戶代號中往往存在以下幾種變動元素:年份、月份、日期、流水號。由于需求比較簡單,因此考慮到用戶可能存在其他變動元素,所以我打算在“被第一顆子彈擊中”后重構(gòu)一下現(xiàn)有的結(jié)構(gòu)。下面就是我在頭腦中演繹過的使用責(zé)任鏈模式的重構(gòu)。

這里只用來說明下責(zé)任鏈模式的結(jié)構(gòu)和使用,因此不體現(xiàn)功能細節(jié)。

//這是抽象處理者角色

public interface CodeAutoParse {

 //這里就是統(tǒng)一的處理請求使用的接口

 String[] generateCode(String moduleCode, int number, String rule,String[] target) throws BaseException;

}

//這個為處理日期使用的具體處理者

public class DateAutoParse implements CodeAutoParse{

 //獲取當(dāng)前時間

 private final Calendar currentDate = Calendar.getInstance();

 //這里用來注入下一個處理者,系統(tǒng)中采用的是Spring來管理的

 private CodeAutoParse theNextParseOfDate;
 public void setTheNextParseOfDate(CodeAutoParse theNextParseOfDate){
this.theNextParseOfDate = theNextParseOfDate ;
 }

 /*
 *實現(xiàn)的處理請求的接口
 *這個接口首先判斷用戶定義的格式是否有流水號,有則解析,沒有則跳過
 *下傳到下一個處理者
 */

 public String[] generateCode(String moduleCode, int number, String rule, String[] target)
throws BaseException {
 //這里省略了處理的業(yè)務(wù)
 ……
 if(theNextParseOfDate != null)
return theNextParseOfDate.generateCode(moduleCode , number , rule, target)
 else
return target;
 }

其它具體處理者也是如此的結(jié)構(gòu),每一個里面都設(shè)置有一個用來存放下一個處理者的引用,不管你有沒有下一個處理者。

其實責(zé)任鏈模式本身的結(jié)構(gòu)和使用都沒有什么,就是一個繼承或者實現(xiàn)。在處理請求的時候,按照規(guī)定去調(diào)用下一個處理者。但是怎么來維護這樣一條鏈子呢?

《設(shè)計模式》一書中僅僅說必須自己引入它,可以參考使用list或者map來進行注冊。而在上面我使用spring來管理具體處理者角色的引入。當(dāng)有了新的處理者需要添加的時候,僅僅需要修改下配置文件。

五、其他

責(zé)任鏈模式優(yōu)點,上面已經(jīng)體現(xiàn)出來了。無非就是降低了耦合、提高了靈活性。但是責(zé)任鏈模式可能會帶來一些額外的性能損耗,因為它要從鏈子開頭開始遍歷。

【編輯推薦】

  1. Java多線程編程基礎(chǔ)之線程和多線程
  2. Java程序開發(fā)中如何應(yīng)用線程
  3. 運用加密技術(shù)保護Java源代碼
責(zé)任編輯:book05 來源: 天新網(wǎng)
相關(guān)推薦

2022-12-02 09:13:28

SeataAT模式

2012-02-21 13:55:45

JavaScript

2011-07-04 10:39:57

Web

2022-05-26 09:20:01

JavaScript原型原型鏈

2021-03-16 08:54:35

AQSAbstractQueJava

2022-09-26 09:01:15

語言數(shù)據(jù)JavaScript

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2009-11-30 16:46:29

學(xué)習(xí)Linux

2016-12-27 09:10:29

JavaScript原型鏈繼承

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2021-07-20 15:20:02

FlatBuffers阿里云Java

2012-05-21 10:06:26

FrameworkCocoa

2017-07-02 18:04:53

塊加密算法AES算法

2023-09-01 08:27:34

Java多線程程序

2019-11-14 09:53:30

Set集合存儲

2009-12-25 15:49:43

Linux rescu

2009-11-17 17:31:58

Oracle COMM

2016-10-14 13:53:05

JavascriptDOMWeb

2010-07-16 09:11:40

JavaScript內(nèi)存泄漏

2016-10-14 14:32:58

JavascriptDOMWeb
點贊
收藏

51CTO技術(shù)棧公眾號