国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > PHP > 正文

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

2024-05-04 23:38:45
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這篇文章主要介紹了PHP的責(zé)任鏈編程模式,也是開發(fā)團(tuán)隊(duì)廣泛采用的一種編程方式約定,需要的朋友可以參考下

概述

責(zé)任鏈模式是一種對(duì)象的行為模式。在責(zé)任鏈模式里,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求。發(fā)出這個(gè)請(qǐng)求的客戶端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶端的情況下動(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)求和處理分開。請(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í)候,由于采用了類似遞歸的方式 ,調(diào)試的時(shí)候邏輯可能比較復(fù)雜。

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

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

具體處理者(ConcreateHandle)角色:具體處理者接到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。由于具體處理者持有對(duì)下家的引用,因此,如果需要,具體處理這可以訪問(wèn)下家

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

 

 
  1. <?php  
  2.  
  3. /**  
  4. * 抽象處理者角色  
  5. * @author wzy  
  6.  
  7. */ 
  8. abstract class Handle  
  9. {  
  10.  
  11. /**  
  12. * 持有后繼的責(zé)任對(duì)象  
  13.  
  14. * @var object  
  15. */ 
  16. protected $successor;  
  17.  
  18. /**  
  19. * 示意處理請(qǐng)求的方法,雖然這個(gè)示意方法是沒有傳入?yún)⑺氐?nbsp; 
  20. * 但實(shí)際是可以傳入?yún)?shù)的,根據(jù)具體需要來(lái)選擇是否傳遞參數(shù)  
  21. */ 
  22. public abstract function handleRequest ();  
  23.  
  24. /**  
  25. * 取值方法  
  26.  
  27. * @return object  
  28. */ 
  29. public function getSuccessor ()  
  30. {  
  31. return $this->successor;  
  32. }  
  33.  
  34. /**  
  35. * 賦值方法,設(shè)置后繼的責(zé)任對(duì)象  
  36.  
  37. * @param object $objsuccessor  
  38. */ 
  39. public function setSuccessor ($objsuccessor)  
  40. {  
  41. $this->successor = $objsuccessor;  
  42. }  
  43. }  
  44.  
  45. /**  
  46. * 具體處理者角色  
  47.  
  48. * @author wzy  
  49.  
  50. */ 
  51. class ConcreateHandler extends Handle  
  52. {  
  53.  
  54. /**  
  55. * 判斷是否有后繼的責(zé)任對(duì)象  
  56. * 如果有,就轉(zhuǎn)發(fā)請(qǐng)求給后繼的責(zé)任對(duì)象  
  57. * 如果沒有,則處理請(qǐng)求  
  58.  
  59. * @see Handle::handleRequest()  
  60. */ 
  61. public function handleRequest ()  
  62. {  
  63. if ($this->getSuccessor() != null) {  
  64. echo "放過(guò)請(qǐng)求,將請(qǐng)求轉(zhuǎn)發(fā)給后繼的責(zé)任對(duì)象!<br>";  
  65. $this->getSuccessor()->handleRequest();  
  66. else {  
  67. echo "處理請(qǐng)求,處理過(guò)程省略...<br>";  
  68. }  
  69. }  
  70. }  
  71.  
  72. /**  
  73. * 客戶端代碼  
  74. */ 
  75.  
  76. // 組裝責(zé)任鏈  
  77. $handle1 = new ConcreateHandler();  
  78. $handle2 = new ConcreateHandler();  
  79. $handle1->setSuccessor($handle2);  
  80.  
  81. // 提交請(qǐng)求  
  82. $handle1->handleRequest();  
  83. ?>  

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沿河| 武宣县| 治县。| 建德市| 绩溪县| 宁阳县| 铜山县| 甘肃省| 黎川县| 中卫市| 广东省| 梅州市| 阜城县| 泗洪县| 北票市| 柏乡县| 抚宁县| 汤原县| 杭锦旗| 成安县| 鄂伦春自治旗| 图木舒克市| 南涧| 道孚县| 溧水县| 出国| 望城县| 湘西| 山东| 公主岭市| 阳西县| 翁源县| 淮南市| 建昌县| 唐山市| 沅江市| 湖口县| 日土县| 庐江县| 湟源县| 房山区|