ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターン シリーズ - Mediator Pattern_PHP チュートリアル
中間モデル
Mediator パターンは、相互に直接通信することなく、同様のオブジェクトのコレクションへの変更を通信または仲介できるオブジェクトを開発するために使用されます。一般に、同期を維持する必要がある類似のプロパティを持つ非結合オブジェクトを扱う場合、最良のアプローチはメディエーター パターンです。 PHP ではあまり一般的に使用されないデザイン パターン。
デザインシーン:
CD クラスと MP3 クラスがあり、どちらのクラスも同様の構造をしています。
CD カテゴリを更新するときに、同時に MP3 カテゴリも更新する必要があります。
従来のアプローチは、CD クラスで MP3 クラスをインスタンス化してから更新することですが、これを行うと、新しい MP4 クラスが追加された場合にコードが処理されなくなります。
メディエーター パターンは、メディエーター クラスを介してこの状況を適切に処理します。メディエーター クラスが CD クラスで呼び出されている限り、データを同期的に更新できます。
phpwind フォーラムでは、このデザイン パターンが以前に使用されています。
コード:
[php]
クラス CD {
パブリック $band = '';
パブリック $title = '';
保護された $_mediator
パブリック関数 __construct(MusicContainerMediator $mediator = NULL) {
$this->_mediator = $mediator;
}
パブリック関数 save() {
//具体的な実装は未定
var_dump($this);
}
パブリック関数changeBandName($bandname) {
If ( ! is_null($this->_mediator)) {
$ this-> _mediator-> change($ this、array( "band" => $ bandname));
$this->band = $bandname;
$this->save();
}
//MP3Archive クラス
クラス MP3Archive {
保護された$_mediator;
パブリック関数 __construct(MusicContainerMediator $mediator = NULL) {
$this->_mediator = $mediator;
パブリック関数 save() {
//具体的な実装は未定
var_dump($this); }
public function changeBandName($bandname) {
if ( ! is_null($this->_mediator)) {
$this->_mediator->change($this, array("band" => $bandname));
}
$this->バンド = $バンド名;
$this->save();
}
}
//中介者类
クラス MusicContainerMediator {
protected $_containers = array();
パブリック関数 __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 = 新しい $container;
$object->title = $title;
$object->band = $band;
foreach ($newValue as $key => $val) {
$object->$key = $val;
}
$object->save();
}
}
}
}
//测试实例
$titleFromDB = "肋骨の無駄";
$bandFromDB = "二度としない";
$mediator = new MusicContainerMediator();
$cd = 新しい CD($mediator);
$cd->title = $titleFromDB;
$cd->バンド = $bandFromDB;
$cd->changeBandName("もう一度もう一度");
作者:initphp