最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單介紹PHP的責(zé)任鏈編程模式

 更新時(shí)間:2015年08月11日 15:55:14   作者:zinss26914  
這篇文章主要介紹了PHP的責(zé)任鏈編程模式,也是開(kāi)發(fā)團(tuán)隊(duì)廣泛采用的一種編程方式約定,需要的朋友可以參考下

概述
責(zé)任鏈模式是一種對(duì)象的行為模式。在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求。發(fā)出這個(gè)請(qǐng)求的客戶(hù)端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶(hù)端的情況下動(dòng)態(tài)的重新組織和分配責(zé)任

責(zé)任鏈模式的定義
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接受者之間耦合關(guān)系,將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有對(duì)象處理它為止。
 
責(zé)任鏈模式的優(yōu)點(diǎn)
最為顯著的優(yōu)點(diǎn)就是將請(qǐng)求和處理分開(kāi)。請(qǐng)求者可以不用知道是誰(shuí)處理的,處理者可以不用知道請(qǐng)求的全貌,兩者解耦,提高系統(tǒng)的靈活性。
  
責(zé)任鏈模式的缺點(diǎn)
一是性能問(wèn)題,每個(gè)請(qǐng)求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長(zhǎng)的時(shí)候,性能是一個(gè)問(wèn)題。二是調(diào)試不是很方便,特別是鏈條比較長(zhǎng)的,環(huán)節(jié)比較多的時(shí)候,由于采用了類(lèi)似遞歸的方式 ,調(diào)試的時(shí)候邏輯可能比較復(fù)雜。

責(zé)任鏈模式涉及到的角色如下:

    抽象處理者(Handler)角色:定義出一個(gè)處理請(qǐng)求的接口。如果需要,接口可以定義出一個(gè)方法以設(shè)定和返回對(duì)下家的引用。這個(gè)角色通常由一個(gè)php的抽象類(lèi)或接口實(shí)現(xiàn)。上圖中Handler類(lèi)的聚合關(guān)系給出了具體子類(lèi)對(duì)下家的引用,抽象方法handleRequest()規(guī)范了子類(lèi)處理請(qǐng)求的操作
    具體處理者(ConcreateHandle)角色:具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理這可以訪問(wèn)下家


來(lái)看一個(gè)PHP的責(zé)任鏈模式編程實(shí)例:
 

  <?php 
   
  /** 
   * 抽象處理者角色 
   * @author wzy 
   * 
   */ 
  abstract class Handle 
  { 
   
    /** 
     * 持有后繼的責(zé)任對(duì)象 
     * 
     * @var object 
     */ 
    protected $successor; 
   
    /** 
     * 示意處理請(qǐng)求的方法,雖然這個(gè)示意方法是沒(méi)有傳入?yún)⑺氐?
     * 但實(shí)際是可以傳入?yún)?shù)的,根據(jù)具體需要來(lái)選擇是否傳遞參數(shù) 
     */ 
    public abstract function handleRequest (); 
   
    /** 
     * 取值方法 
     * 
     * @return object 
     */ 
    public function getSuccessor () 
    { 
      return $this->successor; 
    } 
   
    /** 
     * 賦值方法,設(shè)置后繼的責(zé)任對(duì)象 
     * 
     * @param object $objsuccessor       
     */ 
    public function setSuccessor ($objsuccessor) 
    { 
      $this->successor = $objsuccessor; 
    } 
  } 
   
  /** 
   * 具體處理者角色 
   * 
   * @author wzy 
   *     
   */ 
  class ConcreateHandler extends Handle 
  { 
   
    /** 
     * 判斷是否有后繼的責(zé)任對(duì)象 
     * 如果有,就轉(zhuǎn)發(fā)請(qǐng)求給后繼的責(zé)任對(duì)象 
     * 如果沒(méi)有,則處理請(qǐng)求 
     * 
     * @see Handle::handleRequest() 
     */ 
    public function handleRequest () 
    { 
      if ($this->getSuccessor() != null) { 
        echo "放過(guò)請(qǐng)求,將請(qǐng)求轉(zhuǎn)發(fā)給后繼的責(zé)任對(duì)象!<br>"; 
        $this->getSuccessor()->handleRequest(); 
      } else { 
        echo "處理請(qǐng)求,處理過(guò)程省略...<br>"; 
      } 
    } 
  } 
   
  /** 
   * 客戶(hù)端代碼 
   */ 
   
  // 組裝責(zé)任鏈 
  $handle1 = new ConcreateHandler(); 
  $handle2 = new ConcreateHandler(); 
  $handle1->setSuccessor($handle2); 
   
  // 提交請(qǐng)求 
  $handle1->handleRequest(); 
  ?> 


通過(guò)代碼可以看出,客戶(hù)端創(chuàng)建了兩個(gè)處理者對(duì)象,并指定第一個(gè)處理者對(duì)象的下家是第二個(gè)處理者對(duì)象,而第二個(gè)處理者對(duì)象卻沒(méi)有下家。然后客戶(hù)端將請(qǐng)求傳遞給第一個(gè)處理者對(duì)象

相關(guān)文章

最新評(píng)論

麻城市| 雷波县| 高邑县| 河北区| 临清市| 钦州市| 剑河县| 平舆县| 竹山县| 揭西县| 海晏县| 阜南县| 建平县| 通河县| 兰坪| 孙吴县| 海盐县| 荥经县| 青龙| 江口县| 寻乌县| 连云港市| 赣州市| 冀州市| 北海市| 鄂尔多斯市| 东乡族自治县| 南阳市| 汽车| 米林县| 咸丰县| 怀安县| 鄄城县| 华宁县| 无极县| 平和县| 新竹市| 饶河县| 会理县| 西乌| 乌鲁木齐县|