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, ['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著

原文

blog.csdn.net/initphp/article/deta...

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
贡献者:1
讨论数量: 0
发起讨论 查看所有版本


暂无话题~