1. 云栖社区>
  2. PHP教程>
  3. 正文

PHP设计模式系列 - 中介者模式

作者:用户 来源:互联网 时间:2017-12-01 13:40:07

开发能够

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

中介者模式
中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。
设计场景:
我们有一个CD类和一个MP3类,两个类的结构相似。
我们需要在CD类更新的时候,同步更新MP3类。
传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
我们的phpwind论坛中,之前有用到过这个设计模式。
代码:
[php]
<?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");   
作者:initphp

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索开发 , 的 , 能够 ,以便于您获取更多的相关知识。