天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP設計模式之調解者模式的深入解析

調解者模式,這個模式的目的是封裝一組對象之間的相互作用,防止對象之間相互干擾,調解者(Mediator)在同事對象(Colleague)之間充當中間匯聚點。同事對象之間應該保持松散耦合,避免一個對象直接明確指向另一個對象。在調解者模式下,對象的關系和依賴發生沖突時,我們可以使用調解者在耦合的對象之間協調工作流,依賴可以從同事朝調解者或從調解者向同事建立,這兩個方向上的依賴都可以使用AbstractColleague或AbstractMediator中斷。



對象不是孤立的,對象之間必須相互協作才能完成任務。雖然調解者模式可以限制對象之間的相互作用,但如果濫用,會致使編寫聚合性類變得非常困難。舉一個實用的例子,在領域驅動設計(Domain-Driven Design)中的服務就是實體之間的調解者。再舉一個php相關的例子,Zend_Form裝飾和過濾功能實際上可以看作是Zend_Form_Decorator和Zend_Filter實例之間的一個簡單調解者,它們都使用Zend_Validate對象進行驗證。

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

參與者:
◆同事(Colleague):重點是它的職責,它只與一個調解者Mediator或AbstractMediator通信。
◆調解者(Mediator):協同多個Colleagues(AbstractColleagues)共同工作。
◆AbstractMediator,AbstractColleague:從這些角色的真實實現解耦的可選接口,可能不止一個AbstractColleague角色。
下面的代碼實現了一個表單輸入的過濾過程,類似于Zend_Form_Element功能。
復制代碼 代碼如下:
    <?php
    /** 
     * AbstractColleague. 
     */ 
    interface Filter 
    { 
 public function filter($value); 
    } 

    /** 
     * Colleague. We decide in the implementation phase 
     * that Colleagues should not know the next Colleague 
     * in the chain, resorting to a Mediator to link them together. 
     * This choice succesfully avoids a base abstract class 
     * for Filters. 
     * Remember that this is an example: it is not only 
     * Chain of Responsibility that can be alternatively implemented 
     * as a Mediator. 
     */ 
    class TrimFilter implements Filter 
    { 
  public function filter($value) 
  { 
      return trim($value); 
  } 
    } <PRE class=php name="code">    /** 
     * Colleague. 
     */ 
    class NullFilter implements Filter 
    { 
 public function filter($value) 
 { 
     return $value ? $value : ''; 
 } 
    } 

    /** 
     * Colleague. 
     */ 
    class HtmlEntitiesFilter implements Filter 
    { 
 public function filter($value) 
 { 
     return htmlentities($value); 
 } 
    }
</PRE><PRE class=php name="code">    /** 
     * The Mediator. We avoid referencing it from ConcreteColleagues 
     * and so the need for an interface. We leave the implementation 
     * of a bidirectional channel for the Observer pattern's example. 
     * This class responsibility is to store the value and coordinate 
     * filters computation when they have to be applied to the value. 
     * Filtering responsibilities are obviously a concern of 
     * the Colleagues, which are Filter implementations. 
     */ 
    class InputElement 
    { 
 protected $_filters; 
 protected $_value; 

 public function addFilter(Filter $filter) 
 { 
     $this->_filters[] = $filter; 
     return $this; 
 } 

 public function setValue($value) 
 { 
     $this->_value = $this->_filter($value); 
 } 

 protected function _filter($value) 
 { 
     foreach ($this->_filters as $filter) { 
  $value = $filter->filter($value); 
     } 
     return $value; 
 } 

 public function getValue() 
 { 
     return $this->_value; 
 }   
    } 

    $input = new InputElement(); 
    $input->addFilter(new NullFilter()) 
   ->addFilter(new TrimFilter()) 
   ->addFilter(new HtmlEntitiesFilter()); 
    $input->setValue(' You should use the <h1>-<h6> tags for your headings.'); 
    echo $input->getValue(), "/n";
</PRE>
<PRE></PRE>

php技術PHP設計模式之調解者模式的深入解析,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 海量激情文学 | 99国产在线精品视频 | 久久精品一卡二卡三卡四卡视频版 | 亚洲国产在线观看免费视频 | 欧美激情精品久久久久 | 亚洲第一伊人 | 色婷婷激婷婷深爱五月小蛇 | A级超碰视频在线观看 | 精品在线观看一区 | 甜性涩爱dvd | 一本到2019线观看 | 饥渴难耐的浪荡艳妇在线观看 | 伊人影院综合在线 | 男人女人边摸边吃奶边做 | 天天躁日日躁狠狠躁午夜剧场 | 日本19xxxx撤尿 | 男人边吃奶边挵进去呻吟漫画 | 99热在线播放| 国产1000部成人免费视频 | 免费精品国偷自产在线在线 | 男人插曲女人身体视频 | 亚洲精品久久区二区三区蜜桃臀 | 男人吃奶摸下弄进去好爽 | 中文字幕完整高清版 | 色久悠悠无码偷拍自怕 | 麻豆AV久久AV盛宴AV | 久久精品国产亚洲AV未满十八 | 511麻豆视传媒精品AV | 欧美高清videos 360p | 国产综合在线观看 | 国产精品久久久亚洲偷窥女厕 | 亚洲 无码 制服 日韩 | 亚洲日韩一区精品射精 | 午夜精品久久久内射近拍高清 | 亚洲zooz人禽交xxxx | 精品视频在线播放 | 性直播免费 | 亚洲熟妇无码乱子AV电影 | 电影日本妻子 | 一本大道无码AV天堂欧美 | 免费观看视频成人国产 |