PHP设计模式系列 - 中介者模式
- 中介者模式
中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP 中不是特别常用的设计模式。
- 设计场景:
- 我们有一个 CD 类和一个 MP3 类,两个类的结构相似。
- 我们需要在 CD 类更新的时候,同步更新 MP3 类。
- 传统的做法就是在 CD 类中实例化 MP3 类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的 MP4 类,那么就没法处理了。
- 中介者模式很好的处理了这种情况,通过中介者类,CD 类中只要调用中介者这个类,就能同步更新这些数据。
- 我们的 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, ['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, ["band" => $bandname]);
}
$this->band = $bandname;
$this->save();
}
}
// 中介者类
class MusicContainerMediator
{
protected $_containers = [];
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");
参考:《PHP 设计模式》Aaron Saray 著
推荐文章: