中介者設計模式

<?php

//中介者設計模式用於開發一個對象,這個對象能夠在類似對象相互之間不直接交互的情況下傳送或調解對這些對象的集合的修改。

class CD{
    public $band = '';
    public $title = '';
    protected $_mediator;

    public function __construct($mediator = null){
        $this->_mediator = $mediator;
    }

    public function save(){
        var_dump($this);
    }

    public function changeBandName($newName){
        if(!is_null($this->_mediator)){
            $this->_mediator->change($this, ['band' => $newName]);
        }
        $this->band = $newName;
        $this->save();
    }
}

class MP3Archive{
    public $band = '';
    public $title = '';
    protected $_mediator;

    public function __construct($mediator = null){
        $this->_mediator = $mediator;
    }

    public function save(){
        var_dump($this);
    }

    public function changeBandName($newName){
        if(!is_null($this->_mediator)){
            $this->_mediator->change($this, ['band' => $newName]);
        }
        $this->band = $newName;
        $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(get_class($originalObject) != $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');

//處理具有類似屬性並且屬性需要保持同步的非耦合對象時,最佳的做法是使用基於中介者設計模式的對象。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章