設計模式之Chain of Responsibility(職責鏈)

news/2024/7/4 1:45:55 标签: interface, string, class, java, c
cle class="tags" href="/tags/CLASS.html" title=class>class="baidu_pl">
cle_content" class="tags" href="/tags/CLASS.html" title=class>class="article_content clearfix">
content_views" class="tags" href="/tags/CLASS.html" title=class>class="htmledit_views">

Chain of Responsibility定義
Chain of Responsibility(CoR)
是用一系列類別(class="tags" href="/tags/CLASS.html" title=class>classes)試圖處理一個請求request,這些類別之間是一個鬆散的耦合,唯一共同點是在他們之間傳遞request 也就是說࿰c;來了一個請求࿰c;A類別先處理࿰c;如果沒有處理࿰c;就傳遞到B類別處理࿰c;如果沒有處理࿰c;就傳遞到C類別處理࿰c;就這樣象一個鏈條(chain)一樣傳遞下去。

如何使用?
雖然這一段是如何使用CoR,但是也是演示什麽是CoR

有一個Handler介面:

public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface Handler{
  
public void handleRequest();
}

這是一個處理request的事例࿰c; 如果有多種request,比如 請求幫助 請求列印 或請求格式化:

最先想到的解決方案是:在介面中增加多個請求:
public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface Handler{
  public void handleHelp();
  
public void handlePrint();
  public void handleFormat();

}

具體是一段實現介面Handler代碼:
public class="tags" href="/tags/CLASS.html" title=class>class ConcreteHandler implements Handler{
  private Handler successor;

  public ConcreteHandler(Handler successor){
  
this.successor=successor;
}

  public void handleHelp(){
    //具體處理請求Help的代碼

    ...
  }

  public void handlePrint(){
    //如果是print 轉去處理
Print
    
successor.handlePrint();
  
}
  
public void handleFormat(){
    //如果是Format 轉去處理
format
    
successor.handleFormat();
  }

}
一共有三個這樣的具體實現類別࿰c;上面是處理help,還有處理Print 處理Format這大概是我們最常用的編程思路。

雖然思路簡單明瞭࿰c;但是有一個擴展問題࿰c;如果我們需要再增加一個請求request種類,需要修改介面及其每一個實現。

第二方案:將每種request都變成一個介面࿰c;因此我們有以下代碼

public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface HelpHandler{
  
public void handleHelp();
}

public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface PrintHandler{
  
public void handlePrint();
}

public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface FormatHandler{
  
public void handleFormat();
}

public class="tags" href="/tags/CLASS.html" title=class>class ConcreteHandler
  
implements HelpHandler,PrintHandler,FormatHandlet{
  
private HelpHandler helpSuccessor;
  
private PrintHandler printSuccessor;
  private FormatHandler formatSuccessor;

  public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler             formatSuccessor)
  
{
    
this.helpSuccessor=helpSuccessor;
    
this.printSuccessor=printSuccessor;
    
this.formatSuccessor=formatSuccessor;
  }

  public void handleHelp(){
    
.......
  }

  public void handlePrint(){this.printSuccessor=printSuccessor;}

  public void handleFormat(){this.formatSuccessor=formatSuccessor;}

}

這個辦法在增加新的請求request情況下࿰c;只是節省了介面的修改量࿰c;介面實現ConcreteHandler還需要修改。而且代碼顯然不簡單美麗。

解決方案3: Handler介面中只使用一個參數化方法:
public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface Handler{
  public void handleRequest(String request);
}
那麽Handler實現代碼如下:

public class="tags" href="/tags/CLASS.html" title=class>class ConcreteHandler implements Handler{
  private Handler successor;

  public ConcreteHandler(Handler successor){
    
this.successor=successor;
  }

  public void handleRequest(String request){
    
if (request.equals("Help")){
      //這裏是處理Help的具體代碼

    }else
      //傳遞到下一個

      successor.handle(request);

    }
  }

}

這裏先假設requestString類型࿰c;如果不是怎麽辦?當然我們可以創建一個專門類別Request

最後解決方案:介面Handler的代碼如下:
public class="tags" href="/tags/CLASS.html" title=class>class="tags" href="/tags/INTERFACE.html" title=interface>interface Handler{
  public void handleRequest(Request request);
}
Request
類別的定義
:
public class="tags" href="/tags/CLASS.html" title=class>class Request{
  
private String type;

  public Request(String type){this.type=type;}

  public String getType(){return type;}

  public void execute(){
    //request真正具體行爲代碼

  }
}
那麽Handler實現代碼如下:

public class="tags" href="/tags/CLASS.html" title=class>class ConcreteHandler implements Handler{
  private Handler successor;

  public ConcreteHandler(Handler successor){
    
this.successor=successor;
  }

  public void handleRequest(Request request){
    
if (request instanceof HelpRequest){
      //這裏是處理Help的具體代碼

    }else if (request instanceof PrintRequst){
      
request.execute();
    
}else
      //傳遞到下一個

      successor.handle(request);

    }
  }

}

這個解決方案就是CoR, 在一個鏈上,都有相應職責的類別,因此叫Chain of Responsibility

CoR的優點:
因爲無法預知來自外界的請求是屬於哪種類型࿰c;每個類別如果碰到它不能處理的請求只要放棄就可以。無疑這降低了類別之間的耦合性。

缺點是效率低࿰c;因爲一個請求的完成可能要遍曆到最後才可能完成࿰c;當然也可以用樹的概念優化。 Java AWT1.0中࿰c;對於滑鼠按鍵事情的處理就是使用CoR,Java.1.1以後࿰c;就使用Observer代替CoR

擴展性差࿰c;因爲在CoR中࿰c;一定要有一個統一的介面Handler.局限性就在這裏。


 
cle>

http://www.niftyadmin.cn/n/607089.html

相关文章

python数学公式编辑工具_1行代码搞定Latex公式编写,这个4.6M的Python小插件,堪称论文必备神器...

萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 写论文时,手敲成堆的计算公式,被虐到头秃?做讲课PPT时,几十页的计算推理公式,恨不得直接手写拍照? 现在,解放双手的时刻来了,只需要掌…

ntko php,NTKO OFFICE文档控件

NTKO OFFICE文档控件是拥有完全自主知识产权的ActiveX控件。使用NTKO Office文档控件,能够在浏览器中直接编辑Word,Excel等Office文档,或者WPS,金山电子表等文档并保存到web服务器。实现文档和电子表格的统一管理。NTKO OFFICE文档控件具有在…

JavaScript的几种排序方法

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:  输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…&…

爬取百度知道分类_Python爬虫实战(一) 用Python爬取百度百科

1、爬取百度百科百度百科是一个静态网页,爬取起来很简单,而且请求参数可以直接放在 URL 里面,例如:地址 https://baike.baidu.com/item/网络爬虫 对应的就是 网络爬虫 的百度百科页面地址 https://baike.baidu.com/item/计算机 对…

cronolog介绍

Linux下运行的Web服务器Apache,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计。安装cronolog后,可以将日志文件按时间分割,易于管理和分析。 1、安装 下载:wget -c http://cronolog.org…

設計模式之State

State的定義: 不同的狀態,不同的行爲;或者說,每個狀態有著相應的行爲。 何時使用?State模式在實際使用中比較多,適合"狀態的切換"。因爲我們經常會使用If elseif else 進行狀態切換, 如果針對狀態的這樣判斷切換反復出現,我們就要聯想到是否可以採取State模式了。 …

php框架怎么理解,初学应该如何理解PHP框架

初学应该如何理解PHP框架PHP成为世界上最流行的脚本语言有许多原因:灵活性,易用性等等。但通常只用PHP或者其他语言编码就会显得单调、重复,这时候就需要一个PHP框架来代替程序员完成那些重复不变的部分。本文通过回答What, When, Why 以及 W…

张小娴的经典句子

世上最遥远的距离,不是生与死的距离,不是天各一方,而是我就站在你面前,你却不知道我爱你。    我爱你....为了你的幸福,我愿意放弃一切---包括你。    失望,有时候也是一种幸福,因为有所期待所以才会失望。因为有爱,才会有期…