龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php 代码均来源于《PHP设计模式》一书(4)

时间:2015-04-01 15:48来源:网络整理 作者:网络 点击:
分享到:
Mediator.class.phpnbsp;~nbsp;3KBnbsp;nbsp;nbsp;nbsp;下载(19) ?php/** * 转自 《PHP设计模式》 第十二章: 中介者模式 * 中介者: 中介者设计莫用于开发一个对象,这个对

Mediator.class.php ~ 3KB    下载(19)

<?php
/** 
 * 转自 《PHP设计模式》 第十二章: 中介者模式
 * 中介者: 中介者设计莫用于开发一个对象,这个对象能够在类似对象相互之间不直接交互的情况下传送或调节对这些对象的集合的修改 
 * 处理具有类似属性并且属性需要保持同步的非耦合对象时,最佳的做法是使用基于中介者设计模式的对象。
 *
 */
/**
 * 测试用例描述:示例代码不仅允许乐队进入和管理他们的音乐合集,而且还允许乐队更新他们的配置文件,修改乐队相关信息以及更新其CD信息
 *        现在,艺术家可上传MP3集合并从Web站点撤下CD。 因此, Web站点需要保持相对应的CD和MP3彼此同步。
 *
 */
//CD类
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, array("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, array("band" => $bandname));
        }
        $this->band = $bandname;
        $this->save();
    }
}

//中介者类
class MusicContainerMediator {

    protected $_containers = array();

    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");

/* End of Mediator.class.php */
/* Location the file Design/Mediator.class.php */

test.sql

/*
SQLyog 企业版 - MySQL GUI v8.14 
MySQL - 5.1.52-community : Database - test
*********************************************************************
*/

/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `cd` */

DROP TABLE IF EXISTS `cd`;

CREATE TABLE `cd` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `band` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
  `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT '',
  `bought` int(8) DEFAULT NULL,
  `amount` int(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

/*Data for the table `cd` */

insert  into `cd`(`id`,`band`,`title`,`bought`,`amount`) values (1,'Never Again','Waster of a Rib',1,98);

/*Table structure for table `tracks` */

DROP TABLE IF EXISTS `tracks`;

CREATE TABLE `tracks` (
  `cid` int(8) DEFAULT NULL,
  `tracknum` int(8) DEFAULT NULL,
  `title` varchar(500) COLLATE latin1_bin NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;

/*Data for the table `tracks` */

insert  into `tracks`(`cid`,`tracknum`,`title`) values (1,3,'What It Means'),(1,3,'Brr'),(1,3,'Goodbye');

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

精彩图集

赞助商链接