• 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著

  • 相关阅读:
    PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
    PHP:WampServer下如何安装多个版本的PHP、mysql、apache
    Windows7下无法打开chm(mk:@MSITStore:路径[cannot open the file mk@MSITstore:路径]),chm索引就关闭的解决办法
    C#:ListView控件如何实现点击列表头进行排序?
    C#:struct的陷阱:无法修改“xxx”的返回值,因为它不是变量
    C#:装箱和拆箱相关知识整理
    wifipineapple的evilportal
    mshta 反弹shell
    kali系统教程:创建热点
    office漏洞利用--获取shell
  • 原文地址:https://www.cnblogs.com/wanghaitao/p/9440346.html
Copyright © 2020-2023  润新知