中介者模式

中介者模式

作者:LAMP小白  点击:1839  发布日期:2012-10-07 22:06:00  返回列表
中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接交互的情况下传送或调解对这些对象的集合的修改

如果一个类对数据进行了修改,那么通过中介者模式,可以很轻松的通知所有关联这个数据的类

不多打字了 上代码

mio_lt;?php
    class cd
    {
        public $band = '';
        public $title = '';
        protected $mediator;
        public function __construct($mediator = null)
        {
            $this-mio_gt;mediator = $mediator;
        }
        public function save()
        {
            //保存到数据库
            var_dump($this);
        }
        public function chageBandName($name)
        {
            //如果存在中介者 则调用中介者的change()
            if(!empty($this-mio_gt;mediator))
                $this-mio_gt;_mediator-mio_gt;change($this, array('band'=mio_gt;$name));
            //调用自己的更新方法
            $this-mio_gt;band = $name;
            $this-mio_gt;save();
        }
    }
    //一个类似的类
    class MP3Archive
    {
        protected $mediator;
        public $title = '';
        public $band = '';
        public function __construct($mediator = null)
        {
            $this-mio_gt;mediator = $mediator;
        }
        public function save()
        {
            //同样是将更新后的数据写入数据库
            var_dump($this);
        }
        public function changeBandName($name)
        {
            //同理,但如果将这个动作移动到下面 中介者类会更加省事,少了个foreach
            if(!empty($this-mio_gt;mediator))
                $this-mio_gt;_mediator-mio_gt;change($this, array('band'=mio_gt;$name));
            $this-mio_gt;band = $name;
            $this-mio_gt;save();
        }
    }
    //中介者类
    class MusicContainerMediator
    {
        //用于保存需要通知更改的类
        protected $_containers = array();
        public function __construct()
        {
            $this-mio_gt;_containers[] = 'CD';
            $this-mio_gt;_containers[] = 'MP3Archive';
        }
        public function change($originalObject, $newValue)
        {
            $title = $originalObject-mio_gt;title;
            $band = $originalObject-mio_gt;band;
            foreach($this-mio_gt;_containers as $container){
                //排除掉发起更改的类
                if(empty($changedObject instanceof $container)){
                    $obj = new $container;
                    $obj-mio_gt;title = $title;
                    $obj-mio_gt;band = $band;
                    //update val
                    foreach($newValue as $k =mio_gt; $v)
                        $obj-mio_gt;$k = $v;
                    $obj-mio_gt;save();
                }
            }
        }
    }
?mio_gt;



上一篇:instanceof 下一篇:快递查询API
0