自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP設(shè)計(jì)模式漫談之調(diào)解者模式

原創(chuàng)
開發(fā) 后端 前端
當(dāng)PHP中對(duì)象的關(guān)系和依賴發(fā)生沖突時(shí),我們可以使用調(diào)解者模式在耦合的對(duì)象之間協(xié)調(diào)工作流,有效的防止對(duì)象之間相互干擾。

【51CTO獨(dú)家特稿】本周的《PHP設(shè)計(jì)模式漫談》系列,我們將給大家介紹調(diào)解者模式,這個(gè)模式的目的是封裝一組對(duì)象之間的相互作用,防止對(duì)象之間相互干擾,調(diào)解者(Mediator)在同事對(duì)象(Colleague)之間充當(dāng)中間匯聚點(diǎn)。

同事對(duì)象之間應(yīng)該保持松散耦合,避免一個(gè)對(duì)象直接明確指向另一個(gè)對(duì)象。在調(diào)解者模式下,對(duì)象的關(guān)系和依賴發(fā)生沖突時(shí),我們可以使用調(diào)解者在耦合的對(duì)象之間協(xié)調(diào)工作流,依賴可以從同事朝調(diào)解者或從調(diào)解者向同事建立,這兩個(gè)方向上的依賴都可以使用AbstractColleague或AbstractMediator中斷。

調(diào)解者和同事對(duì)象 
圖1 調(diào)解者和同事對(duì)象

對(duì)象不是孤立的,對(duì)象之間必須相互協(xié)作才能完成任務(wù)。雖然調(diào)解者模式可以限制對(duì)象之間的相互作用,但如果濫用,會(huì)致使編寫聚合性類變得非常困難。舉一個(gè)實(shí)用的例子,在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design)中的服務(wù)就是實(shí)體之間的調(diào)解者。再舉一個(gè)PHP相關(guān)的例子,Zend_Form裝飾和過濾功能實(shí)際上可以看作是Zend_Form_Decorator和Zend_Filter實(shí)例之間的一個(gè)簡(jiǎn)單調(diào)解者,它們都使用Zend_Validate對(duì)象進(jìn)行驗(yàn)證。

當(dāng)調(diào)解者必須監(jiān)聽同事對(duì)象的事件時(shí),它通常是作為觀察者(Observer)實(shí)現(xiàn)的,產(chǎn)生一個(gè)黑板(blackboard)對(duì)象,一些同事寫,另一些同事就讀。來自同事的事件被推向調(diào)解者,再由調(diào)解者將其轉(zhuǎn)發(fā)給其它訂閱的同事,同事之間不需要相互了解,這個(gè)架構(gòu)成功用于隨Zend框架發(fā)布的Dojo JavaScript庫。這個(gè)模式的另一個(gè)好處是對(duì)象的變化包含在計(jì)算方法中,可以通過配置不同的調(diào)解者實(shí)現(xiàn)這一目標(biāo),但實(shí)例化相關(guān)對(duì)象將是一個(gè)松散的操作,不同容器和工廠之間的協(xié)作關(guān)系將是分散的。參與者:

◆同事(Colleague):重點(diǎn)是它的職責(zé),它只與一個(gè)調(diào)解者M(jìn)ediator或AbstractMediator通信。

◆調(diào)解者(Mediator):協(xié)同多個(gè)Colleagues(AbstractColleagues)共同工作。

◆AbstractMediator,AbstractColleague:從這些角色的真實(shí)實(shí)現(xiàn)解耦的可選接口,可能不止一個(gè)AbstractColleague角色。

下面的代碼實(shí)現(xiàn)了一個(gè)表單輸入的過濾過程,類似于Zend_Form_Element功能。

  1. <?php 
  2. /**  
  3.  * AbstractColleague.  
  4.  */  
  5. interface Filter  
  6. {  
  7.     public function filter($value);  
  8. }  
  9.  
  10. /**  
  11.  * Colleague. We decide in the implementation phase  
  12.  * that Colleagues should not know the next Colleague  
  13.  * in the chain, resorting to a Mediator to link them together.  
  14.  * This choice succesfully avoids a base abstract class  
  15.  * for Filters.  
  16.  * Remember that this is an example: it is not only  
  17.  * Chain of Responsibility that can be alternatively implemented  
  18.  * as a Mediator.  
  19.  */  
  20. class TrimFilter implements Filter  
  21. {  
  22.      public function filter($value)  
  23.      {  
  24.          return trim($value);  
  25.      }  
  1. /**  
  2.  * Colleague.  
  3.  */  
  4. class NullFilter implements Filter  
  5. {  
  6.      public function filter($value)  
  7.      {  
  8.          return $value ? $value : '';  
  9.      }  
  10. }  
  11.  
  12. /**  
  13.  * Colleague.  
  14.  */  
  15. class HtmlEntitiesFilter implements Filter  
  16. {  
  17.      public function filter($value)  
  18.      {  
  19.          return htmlentities($value);  
  20.      }  
  1. /**  
  2.  * The Mediator. We avoid referencing it from ConcreteColleagues  
  3.  * and so the need for an interface. We leave the implementation  
  4.  * of a bidirectional channel for the Observer pattern's example.  
  5.  * This class responsibility is to store the value and coordinate  
  6.  * filters computation when they have to be applied to the value.  
  7.  * Filtering responsibilities are obviously a concern of  
  8.  * the Colleagues, which are Filter implementations.  
  9.  */  
  10. class InputElement  
  11. {  
  12.     protected $_filters;  
  13.     protected $_value;  
  14.  
  15.     public function addFilter(Filter $filter)  
  16.     {  
  17.         $this->_filters[] = $filter;  
  18.         return $this;  
  19.     }  
  20.  
  21.     public function setValue($value)  
  22.     {  
  23.         $this->_value = $this->_filter($value);  
  24.     }  
  25.  
  26.     protected function _filter($value)  
  27.     {  
  28.         foreach ($this->_filters as $filter) {  
  29.             $value = $filter->filter($value);  
  30.         }  
  31.         return $value;  
  32.     }  
  33.  
  34.     public function getValue()  
  35.     {  
  36.         return $this->_value;  
  37.     }  
  38. }  
  39.  
  40. $input = new InputElement();  
  41. $input->addFilter(new NullFilter())  
  42.       ->addFilter(new TrimFilter())  
  43.       ->addFilter(new HtmlEntitiesFilter());  
  44. $input->setValue(' You should use the <h1>-<h6> tags for your headings.');  
  45. echo $input->getValue(), "\n"; 

原文名:Practical Php Patterns: Mediator      作者:Giorgio

原文出處:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

【PHP設(shè)計(jì)模式漫談】

  1. PHP設(shè)計(jì)模式漫談之迭代器模式
  2. PHP設(shè)計(jì)模式漫談之解釋器模式
  3. PHP設(shè)計(jì)模式漫談之工廠模式
  4. PHP設(shè)計(jì)模式漫談之命令模式
  5. PHP設(shè)計(jì)模式漫談之結(jié)構(gòu)模式
責(zé)任編輯:王曉東 來源: 51CTO.com
相關(guān)推薦

2010-04-19 09:30:00

工廠模式PHP設(shè)計(jì)模式

2010-03-25 08:52:30

PHP設(shè)計(jì)模式代理模式

2010-04-13 08:54:28

PHP設(shè)計(jì)模式命令模式

2010-04-08 09:27:04

PHP設(shè)計(jì)模式結(jié)構(gòu)模式

2010-04-21 08:38:18

解釋器模式PHP設(shè)計(jì)模式

2010-04-01 09:10:03

PHP設(shè)計(jì)模式責(zé)任鏈模式

2010-04-29 08:53:11

PHP迭代器模式

2020-12-01 07:16:05

重學(xué)設(shè)計(jì)模式

2021-01-21 05:34:14

設(shè)計(jì)模式建造者

2012-05-16 17:15:04

Java設(shè)計(jì)模式

2021-07-08 11:28:43

觀察者模式設(shè)計(jì)

2011-04-21 09:46:41

設(shè)計(jì)模式

2020-10-20 13:33:00

建造者模式

2020-11-05 09:38:07

中介者模式

2021-10-26 00:21:19

設(shè)計(jì)模式建造者

2020-08-21 07:23:50

工廠模式設(shè)計(jì)

2020-10-26 08:45:39

觀察者模式

2023-05-26 08:41:23

模式Go設(shè)計(jì)模式

2021-06-09 08:53:34

設(shè)計(jì)模式策略模式工廠模式

2012-02-29 09:41:14

JavaScript
點(diǎn)贊
收藏

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