zoukankan      html  css  js  c++  java
  • PHP设计模式系列

    • 中介者模式

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

    • 设计场景:
      1. 我们有一个CD类和一个MP3类,两个类的结构相似。
      2. 我们需要在CD类更新的时候,同步更新MP3类。
      3. 传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
      4. 中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
      5. 我们的phpwind论坛中,之前有用到过这个设计模式。
    • 代码:
        <?php  
        class CD {  
            public $band  = '';             
            public $title = '';             
            protected $_mediator;    
              
            public function __construct(MusicContainerMediator $mediator = NULL) {                 
                $this->_mediator = $mediator;             
            }  
              
            public function save() {                
                //具体实现待定                 
                var_dump($this);             
            }  
              
            public function changeBandName($bandname) {                 
                if ( ! is_null($this->_mediator)) {                     
                    $this->_mediator->change($this, array("band" => $bandname));                 
                }                 
                $this->band = $bandname;                 
                $this->save();             
            }           
        }  
        //MP3Archive类         
        class MP3Archive {                        
            protected $_mediator;                        
              
            public function __construct(MusicContainerMediator $mediator = NULL) {                 
                $this->_mediator = $mediator;             
            }                        
              
            public function save() {                 
                //具体实现待定               
                var_dump($this);             
            }                        
              
            public function changeBandName($bandname) {                 
                if ( ! is_null($this->_mediator)) {                     
                    $this->_mediator->change($this, array("band" => $bandname));                 
                }                 
                $this->band = $bandname;                 
                $this->save();             
            }         
              
        }     
          
         //中介者类         
        class MusicContainerMediator {                        
            protected $_containers = array();                        
              
            public function __construct() {                 
                $this->_containers[] = "CD";                 
                $this->_containers[] = "MP3Archive";             
            }                        
              
            public function change($originalObject, $newValue) {                 
                $title = $originalObject->title;                 
                $band  = $originalObject->band;                                
                foreach ($this->_containers as $container) {                     
                    if ( ! ($originalObject instanceof $container)) {                        
                        $object = new $container;                         
                        $object->title = $title;                         
                        $object->band  = $band;                                                
                        foreach ($newValue as $key => $val) {                  
                            $object->$key = $val;                         
                        }                                                
                        $object->save();                     
                    }                 
                }             
            }         
        }     
          
        //测试实例         
        $titleFromDB = "Waste of a Rib";         
        $bandFromDB  = "Never Again";         
        $mediator = new MusicContainerMediator();         
        $cd = new CD($mediator);         
        $cd->title = $titleFromDB;         
        $cd->band  = $bandFromDB;         
        $cd->changeBandName("Maybe Once More");    

    自:http://blog.csdn.net/initphp/article/details/7695805

  • 相关阅读:
    【图像处理】【SEED-VPM】7.ubuntu10.04下 TFTP,NFS 安装指南
    【图像处理】【SEED-VPM】6.文件目录结构
    【DIY】【外壳】木板 & 亚克力 加工
    【图像处理】【SEED-VPM】5.uImage的烧写 & NFS烧写文件系统
    【PCB】【AD使用】Altium Designer 的entry sheet ,offsheet和port作用
    【PCB】【项目记录】AWG任意波形产生器
    【图像处理】【SEED-VPM】4.串口调试信息
    【图像处理】【SEED-VPM】3.外设信息
    【图像处理】【SEED-VPM】2.接口
    【图像处理】【SEED-VPM】1.注意点
  • 原文地址:https://www.cnblogs.com/zhhtao/p/4414701.html
Copyright © 2011-2022 走看看