<?php /** * @author v.r And * * @example * 中介者模式 * 中介者設計模式用於開發一個對象,這個對象可以在相似對象相互之間不直接 * 交互的狀況下傳送或調解對這些對象的集合的修改 * 案例同步數據 * 列如 * 更改數據,須要同步 * * 同步保存數據到雲中 * 同步保存數據到文本 * 同步保存數據到DB * * @copyright copyright information * */ /* class CD { public $band = ''; public $title = ''; public function save() { # code... var_dump($this); } public function changeBandName($newName) { # code... $this->band = $newName; $this->save(); } }*/ class CD { public $band = ''; public $title = ''; protected $mediator; public function __construct($mediator = NULL) { # code... $this->mediator = $mediator; } public function save() { # code... //var_dump($this); print "\n write DB"; } public function changeBandName($newName) { # code... if (!is_null($this->mediator)) { $this->mediator->change($this,array('band'=>$newName)); # code... } $this->band = $newName; $this->save(); } } class MP3Archive { public $band = ''; public $title = ''; protected $mediator; public function __construct($mediator = NULL) { # code... $this->mediator = $mediator; } public function save() { # code... // var_dump($this); print "\n write text"; } public function changeBandName($newName) { # code... if (!is_null($this->mediator)) { $this->mediator->change($this,array('band'=>$newName)); # code... } $this->band = $newName; $this->save(); } } class DataCloud { public $band = ''; public $title = ''; protected $mediator; public function __construct($mediator = NULL) { # code... $this->mediator = $mediator; } public function save() { # code... // var_dump($this); print "\n write Cloud"; } public function changeBandName($newName) { # code... if (!is_null($this->mediator)) { $this->mediator->change($this,array('band'=>$newName)); # code... } $this->band = $newName; $this->save(); } } // 音樂容器中介者模式 class MusicContainerMediator { protected $containers = array(); public function __construct() { # code... $this->containers[] = 'CD'; $this->containers[] = 'MP3Archive'; $this->containers[] = 'DataCloud'; } public function change($originalObj,$newValue) { # code... $title = $originalObj->title; $band = $originalObj->band; foreach ($this->containers as $container) { # code... if (!($originalObj instanceof $container)) { # code... $obj = new $container; $obj->title = $title; $obj->band = $band; foreach ($newValue as $key => $value) { # code... $obj->$key = $value; } $obj->save(); } } } } $titleFromDB = 'was of a RIb'; $bandFromDB = 'Never Again'; $cd = new CD(new MusicContainerMediator); $cd->title = $titleFromDB; $cd->band = $bandFromDB; $cd->changeBandName('Maybe once more'); #end script