久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

責(zé)任鏈模式

 java知識(shí)庫(kù) 2011-12-30

職責(zé)鏈模式(Chain of Responsibility):使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系,。將這些對(duì)象連成一條鏈,,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止,。

適用場(chǎng)景:

1,、有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定,;

2,、在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求,;

3,、處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)被動(dòng)態(tài)指定。

通用類(lèi)圖:

在大學(xué)里面當(dāng)班干部,,時(shí)常要向上級(jí)申請(qǐng)各方面的東西,。譬如申請(qǐng)全班外出秋游,,普通同學(xué)將申請(qǐng)表交給班長(zhǎng),班長(zhǎng)簽字之后交給輔導(dǎo)員,,輔導(dǎo)員批準(zhǔn)之后上交到主任辦公室…就是這樣,,一個(gè)請(qǐng)求(這里是一份申請(qǐng)表)有時(shí)候需要經(jīng)過(guò)好幾個(gè)級(jí)別的處理者(這里是輔導(dǎo)員、主任)的審查才能夠最終被確定可行與否,。

在這里表現(xiàn)出來(lái)的是一個(gè)職責(zé)鏈,,即不同的處理者對(duì)同一個(gè)請(qǐng)求可能擔(dān)負(fù)著不同的處理方式、權(quán)限,,但是我們希望這個(gè)請(qǐng)求必須到達(dá)最終拍板的處理者(否則秋游就沒(méi)戲了),。這種關(guān)系就很適合使用職責(zé)鏈模式了。

類(lèi)圖結(jié)構(gòu)如下:

 代碼實(shí)現(xiàn)如下:

  1. // 全局變量,,接口類(lèi)型  
  2. /**  
  3.  * 使用Java中的interface定義全局變量,,可根據(jù)具體需要在   
  4.  * 具體的包中使用靜態(tài)導(dǎo)入相關(guān)的全局變量,語(yǔ)法如下:   
  5.  *  import static package01.package02.*;  
  6.  */ 
  7. interface Levels {  
  8.     public static final int LEVEL_01 = 1;  
  9.     public static final int LEVEL_02 = 2;  
  10.     public static final int LEVEL_03 = 3;  

 

  1. // 抽象請(qǐng)求類(lèi)  
  2. abstract class AbstractRequest {  
  3.     private String content = null;  
  4.  
  5.     public AbstractRequest(String content) {  
  6.         this.content = content;  
  7.     }  
  8.  
  9.     public String getContent() {  
  10.         return this.content;  
  11.     }  
  12.  
  13.     // 獲得請(qǐng)求的級(jí)別  
  14.     public abstract int getRequestLevel();  

 

  1. // 具體請(qǐng)求類(lèi)01  
  2. class Request01 extends AbstractRequest {  
  3.     public Request01(String content) {  
  4.         super(content);  
  5.     }  
  6.  
  7.     @Override 
  8.     public int getRequestLevel() {  
  9.         return Levels.LEVEL_01;  
  10.     }  
  11. }  
  12.  
  13. // 具體請(qǐng)求類(lèi)02  
  14. class Request02 extends AbstractRequest {  
  15.     public Request02(String content) {  
  16.         super(content);  
  17.     }  
  18.  
  19.     @Override 
  20.     public int getRequestLevel() {  
  21.         return Levels.LEVEL_02;  
  22.     }  
  23. }  
  24.  
  25. // 具體請(qǐng)求類(lèi)03  
  26. class Request03 extends AbstractRequest {  
  27.     public Request03(String content) {  
  28.         super(content);  
  29.     }  
  30.  
  31.     @Override 
  32.     public int getRequestLevel() {  
  33.         return Levels.LEVEL_03;  
  34.     }  

 

  1. // 抽象處理者類(lèi),,  
  2. abstract class AbstractHandler {  
  3.     // 責(zé)任鏈的下一個(gè)節(jié)點(diǎn),,即處理者  
  4.     private AbstractHandler nextHandler = null;  
  5.  
  6.     // 捕獲具體請(qǐng)求并進(jìn)行處理,或是將請(qǐng)求傳遞到責(zé)任鏈的下一級(jí)別  
  7.     public final void handleRequest(AbstractRequest request) {  
  8.  
  9.         // 若該請(qǐng)求與當(dāng)前處理者的級(jí)別層次相對(duì)應(yīng),,則由自己進(jìn)行處理  
  10.         if (this.getHandlerLevel() == request.getRequestLevel()) {  
  11.             this.handle(request);  
  12.         } else {  
  13.             // 當(dāng)前處理者不能勝任,,則傳遞至職責(zé)鏈的下一節(jié)點(diǎn)  
  14.             if (this.nextHandler != null) {  
  15.                 System.out.println("當(dāng)前 處理者-0" + this.getHandlerLevel()  
  16.                         + " 不足以處理 請(qǐng)求-0" + request.getRequestLevel());  
  17.                   
  18.                 // 這里使用了遞歸調(diào)用  
  19.                 this.nextHandler.handleRequest(request);  
  20.             } else {  
  21.                 System.out.println("職責(zé)鏈上的所有處理者都不能勝任該請(qǐng)求...");  
  22.             }  
  23.         }  
  24.     }  
  25.  
  26.     // 設(shè)置責(zé)任鏈中的下一個(gè)處理者  
  27.     public void setNextHandler(AbstractHandler nextHandler) {  
  28.         this.nextHandler = nextHandler;  
  29.     }  
  30.  
  31.     // 獲取當(dāng)前處理者的級(jí)別  
  32.     protected abstract int getHandlerLevel();  
  33.  
  34.     // 定義鏈中每個(gè)處理者具體的處理方式  
  35.     protected abstract void handle(AbstractRequest request);  

 

  1. // 具體處理者-01  
  2. class Handler01 extends AbstractHandler {  
  3.     @Override 
  4.     protected int getHandlerLevel() {  
  5.         return Levels.LEVEL_01;  
  6.     }  
  7.  
  8.     @Override 
  9.     protected void handle(AbstractRequest request) {  
  10.         System.out.println("處理者-01 處理 " + request.getContent() + "\n");  
  11.     }  
  12. }  
  13.  
  14. // 具體處理者-02  
  15. class Handler02 extends AbstractHandler {  
  16.     @Override 
  17.     protected int getHandlerLevel() {  
  18.         return Levels.LEVEL_02;  
  19.     }  
  20.  
  21.     @Override 
  22.     protected void handle(AbstractRequest request) {  
  23.         System.out.println("處理者-02 處理 " + request.getContent()+ "\n");  
  24.     }  
  25. }  
  26.  
  27. // 具體處理者-03  
  28. class Handler03 extends AbstractHandler {  
  29.     @Override 
  30.     protected int getHandlerLevel() {  
  31.         return Levels.LEVEL_03;  
  32.     }  
  33.  
  34.     @Override 
  35.     protected void handle(AbstractRequest request) {  
  36.         System.out.println("處理者-03 處理 " + request.getContent()+ "\n");  
  37.     }  

 

  1. // 測(cè)試類(lèi)  
  2. public class Client {  
  3.     public static void main(String[] args) {  
  4.         // 創(chuàng)建指責(zé)鏈的所有節(jié)點(diǎn)  
  5.         AbstractHandler handler01 = new Handler01();  
  6.         AbstractHandler handler02 = new Handler02();  
  7.         AbstractHandler handler03 = new Handler03();  
  8.  
  9.         // 進(jìn)行鏈的組裝,即頭尾相連,,一層套一層  
  10.         handler01.setNextHandler(handler02);  
  11.         handler02.setNextHandler(handler03);  
  12.  
  13.         // 創(chuàng)建請(qǐng)求并提交到指責(zé)鏈中進(jìn)行處理  
  14.         AbstractRequest request01 = new Request01("請(qǐng)求-01");  
  15.         AbstractRequest request02 = new Request02("請(qǐng)求-02");  
  16.         AbstractRequest request03 = new Request03("請(qǐng)求-03");  
  17.           
  18.         // 每次提交都是從鏈頭開(kāi)始遍歷  
  19.         handler01.handleRequest(request01);  
  20.         handler01.handleRequest(request02);  
  21.         handler01.handleRequest(request03);  
  22.     }  

測(cè)試結(jié)果:

  1. 處理者-01 處理 請(qǐng)求-01 
  2.  
  3. 當(dāng)前 處理者-01 不足以處理 請(qǐng)求-02 
  4. 處理者-02 處理 請(qǐng)求-02 
  5.  
  6. 當(dāng)前 處理者-01 不足以處理 請(qǐng)求-03 
  7. 當(dāng)前 處理者-02 不足以處理 請(qǐng)求-03 
  8. 處理者-03 處理 請(qǐng)求-03 
在上面抽象處理者 AbstractHandler 類(lèi)的 handleRequest() 方法中,,被 protected 修飾,并且該方法中調(diào)用了兩個(gè)必須被子類(lèi)覆蓋實(shí)現(xiàn)的抽象方法,,這里是使用了模板方法模式(Template Mehtod),。其實(shí)在這里,抽象父類(lèi)的 handleRequest() 具備了請(qǐng)求傳遞的功能,,即對(duì)某些請(qǐng)求不能處理時(shí),,馬上提交到下一結(jié)點(diǎn)(處理者)中,而每個(gè)具體的處理者僅僅完成了具體的處理邏輯,,其他的都不用理,。
 
記得第一次看到職責(zé)鏈模式的時(shí)候,我很驚訝于它能夠把我們平時(shí)在代碼中的 if..else.. 的語(yǔ)句塊變成這樣靈活,、適應(yīng)變化,。例如:如果現(xiàn)在輔導(dǎo)員請(qǐng)長(zhǎng)假了,但我們的秋游還是要爭(zhēng)取申請(qǐng)成功呀,,那么我們?cè)?Client 類(lèi)中可以不要?jiǎng)?chuàng)建 handler02,即不要將該處理者組裝到職責(zé)鏈中,。這樣子處理比 if..else..好多了,。或者說(shuō),突然來(lái)了個(gè)愛(ài)管閑事的領(lǐng)導(dǎo),,那么我照樣可以將其組裝到職責(zé)鏈中,。
 
關(guān)于上面使用場(chǎng)景中提到的3個(gè)點(diǎn):
1、處理者在運(yùn)行時(shí)動(dòng)態(tài)確定其實(shí)是我們?cè)?Client 中組裝的鏈所引起的,,因?yàn)榫唧w的職責(zé)邏輯就在鏈中一一對(duì)應(yīng)起來(lái),;
2、因?yàn)椴淮_定請(qǐng)求的具體處理者是誰(shuí),,所以我們把所有可能的處理者組裝成一條鏈,,在遍歷的過(guò)程中就相當(dāng)于向每個(gè)處理者都提交了這個(gè)請(qǐng)求,等待其審查,。并且在審查過(guò)程中,,即使不是最終處理者,也可以進(jìn)行一些請(qǐng)求的“包裝”操作(這種功能類(lèi)似于裝飾者模式),,例如上面例子中的簽名批準(zhǔn),;
3、處理者集合的動(dòng)態(tài)指定跟上面的第1,、2點(diǎn)類(lèi)似,,即在 Client 類(lèi)中創(chuàng)建了所有可能的處理者。
 
不足之處:

1,、對(duì)于每一個(gè)請(qǐng)求都需要遍歷職責(zé)鏈,,性能是個(gè)問(wèn)題;

2,、抽象處理者 AbstractHandler 類(lèi)中的 handleRequest() 方法中使用了遞歸,,棧空間的大小也是個(gè)問(wèn)題,。

 個(gè)人看法:

職責(zé)鏈模式對(duì)于請(qǐng)求的處理是不知道最終處理者是誰(shuí),,所以是運(yùn)行動(dòng)態(tài)尋找并指定;而命令模式中對(duì)于命令的處理時(shí)在創(chuàng)建命令是已經(jīng)顯式或隱式綁定了接收者,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多