• PHP设计模式系列


    • 中介者模式

    中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。 

    • 设计场景:
      1. 我们有一个CD类和一个MP3类,两个类的结构相似。
      2. 我们需要在CD类更新的时候,同步更新MP3类。
      3. 传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
      4. 中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
      5. 我们的phpwind论坛中,之前有用到过这个设计模式。
    • 代码:
    1. <?php  
    2. class CD {  
    3.     public $band  = '';             
    4.     public $title = '';             
    5.     protected $_mediator;    
    6.       
    7.     public function __construct(MusicContainerMediator $mediator = NULL) {                 
    8.         $this->_mediator = $mediator;             
    9.     }  
    10.       
    11.     public function save() {                
    12.         //具体实现待定                 
    13.         var_dump($this);             
    14.     }  
    15.       
    16.     public function changeBandName($bandname) {                 
    17.         if ( ! is_null($this->_mediator)) {                     
    18.             $this->_mediator->change($thisarray("band" => $bandname));                 
    19.         }                 
    20.         $this->band = $bandname;                 
    21.         $this->save();             
    22.     }           
    23. }  
    24. //MP3Archive类         
    25. class MP3Archive {                        
    26.     protected $_mediator;                        
    27.       
    28.     public function __construct(MusicContainerMediator $mediator = NULL) {                 
    29.         $this->_mediator = $mediator;             
    30.     }                        
    31.       
    32.     public function save() {                 
    33.         //具体实现待定               
    34.         var_dump($this);             
    35.     }                        
    36.       
    37.     public function changeBandName($bandname) {                 
    38.         if ( ! is_null($this->_mediator)) {                     
    39.             $this->_mediator->change($thisarray("band" => $bandname));                 
    40.         }                 
    41.         $this->band = $bandname;                 
    42.         $this->save();             
    43.     }         
    44.       
    45. }     
    46.   
    47.  //中介者类         
    48. class MusicContainerMediator {                        
    49.     protected $_containers = array();                        
    50.       
    51.     public function __construct() {                 
    52.         $this->_containers[] = "CD";                 
    53.         $this->_containers[] = "MP3Archive";             
    54.     }                        
    55.       
    56.     public function change($originalObject$newValue) {                 
    57.         $title = $originalObject->title;                 
    58.         $band  = $originalObject->band;                                
    59.         foreach ($this->_containers as $container) {                     
    60.             if ( ! ($originalObject instanceof $container)) {                        
    61.                 $object = new $container;                         
    62.                 $object->title = $title;                         
    63.                 $object->band  = $band;                                                
    64.                 foreach ($newValue as $key => $val) {                  
    65.                     $object->$key = $val;                         
    66.                 }                                                
    67.                 $object->save();                     
    68.             }                 
    69.         }             
    70.     }         
    71. }     
    72.   
    73. //测试实例         
    74. $titleFromDB = "Waste of a Rib";         
    75. $bandFromDB  = "Never Again";         
    76. $mediator = new MusicContainerMediator();         
    77. $cd = new CD($mediator);         
    78. $cd->title = $titleFromDB;         
    79. $cd->band  = $bandFromDB;         
    80. $cd->changeBandName("Maybe Once More");    


     参考:《PHP设计模式》Aaron Saray著

  • 相关阅读:
    ArcGIS for Android示例解析之高亮要素-----HighlightFeatures
    ArcGIS Runtime for Android开发教程V2.0(8)基础篇-----地图事件
    ArcGIS for Android示例解析之空间查询-----QueryTask
    ArcGIS for Android地图控件的5大常见操作
    ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
    ArcGIS for Android 中MapView的地图背景设置
    使用Arcglobe 10与3dmax建立三维城市
    使用PowerDesigner建立数据库模型
    一步一步学Remoting系列文章
    App集成支付宝
  • 原文地址:https://www.cnblogs.com/wanghaitao/p/9440346.html
Copyright © 2020-2023  润新知