日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
PHP設(shè)計(jì)模式漫談之調(diào)解者模式

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

創(chuàng)新互聯(lián)公司主營集美網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),集美h5成都微信小程序搭建,集美網(wǎng)站營銷推廣歡迎集美等地區(qū)企業(yè)咨詢

同事對(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中斷。

 
圖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è)簡單調(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. /**
  2.  * AbstractColleague.
  3.  */
  4. interface Filter
  5. {
  6.     public function filter($value);
  7. }
  8. /**
  9.  * Colleague. We decide in the implementation phase
  10.  * that Colleagues should not know the next Colleague
  11.  * in the chain, resorting to a Mediator to link them together.
  12.  * This choice succesfully avoids a base abstract class
  13.  * for Filters.
  14.  * Remember that this is an example: it is not only
  15.  * Chain of Responsibility that can be alternatively implemented
  16.  * as a Mediator.
  17.  */
  18. class TrimFilter implements Filter
  19. {
  20.      public function filter($value)
  21.      {
  22.          return trim($value);
  23.      }
  24. }
 
 
 
 
  1. /**
  2.  * Colleague.
  3.  */
  4. class NullFilter implements Filter
  5. {
  6.      public function filter($value)
  7.      {
  8.          return $value ? $value : '';
  9.      }
  10. }
  11. /**
  12.  * Colleague.
  13.  */
  14. class HtmlEntitiesFilter implements Filter
  15. {
  16.      public function filter($value)
  17.      {
  18.          return htmlentities($value);
  19.      }
  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.     public function addFilter(Filter $filter)
  15.     {
  16.         $this->_filters[] = $filter;
  17.         return $this;
  18.     }
  19.     public function setValue($value)
  20.     {
  21.         $this->_value = $this->_filter($value);
  22.     }
  23.     protected function _filter($value)
  24.     {
  25.         foreach ($this->_filters as $filter) {
  26.             $value = $filter->filter($value);
  27.         }
  28.         return $value;
  29.     }
  30.     public function getValue()
  31.     {
  32.         return $this->_value;
  33.     }
  34. }
  35. $input = new InputElement();
  36. $input->addFilter(new NullFilter())
  37.       ->addFilter(new TrimFilter())
  38.       ->addFilter(new HtmlEntitiesFilter());
  39. $input->setValue(' You should use the 

    -

     tags for your headings.');
  40. 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)模式

網(wǎng)站名稱:PHP設(shè)計(jì)模式漫談之調(diào)解者模式
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/dhohoei.html