php模式设计之 中介者模式

  • 中介者模式

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。PHP中不是特别常用的设计模式。 

  • 设计场景:
    1. 我们有一个CD类和一个MP3类,两个类的结构相似。
    2. 我们需要在CD类更新的时候,同步更新MP3类。
    3. 传统的做法就是在CD类中实例化MP3类,然后去更新,但是这么做的话,代码就会很难维护,如果新增一个同样的MP4类,那么就没法处理了。
    4. 中介者模式很好的处理了这种情况,通过中介者类,CD类中只要调用中介者这个类,就能同步更新这些数据。
    5. 我们的phpwind论坛中,之前有用到过这个设计模式。
  • 代码:
    <?php
    // | php设计模式 之中介者模式                                             |
    // +----------------------------------------------------------------------+
    // | 主要的功能就是在调用cd类中的change()方法的时候也会调用mp3类中的
    // | save()方法,反之亦然
    // 
    // | 例如以后再想添加一个MP4的类,新建一个MP4类以后,
    // | 直接在 ZhoneJie 类初始化的时候 $this->sonLists [] = 'MP4'; 就可以了
    // +----------------------------------------------------------------------+
    
    class CD{
        protected $mid;
        public function __construct($zj=null){
            $this->mid = $zj;
        }
        public function change(){
            if($this->mid){
                $this->mid->comChange($this);
            }
            $this->save();
        }
        public function save(){
            echo "this is CDclass ! <br /><br /><br />";
        }
    }
    
    class MP3{
        private $mid;
        public function __construct($zj=null){
            $this->mid = $zj;
        }
        public function change(){
            if($this->mid){
                $this->mid->comChange($this);
            }
            $this->save();
        }
        public function save(){
            echo "this is MP3class ! <br /><br /><br />";
        }
    }
    
    //中间类
    class ZhoneJie{
        private $sonLists;
        public function __construct(){
            //等于是先注册,下一步的时候会排除一个,然后把剩余的都调用一遍
            $this->sonLists [] = 'CD';
            $this->sonLists [] = 'MP3';
        }
        public function comChange($baseObj,$parameter=array()){
            //遍历初始化时候注册的 顾客
            foreach($this->sonLists as $class){
                //排除自身,然后剩余的其他顾客
                if(!($baseObj instanceof $class)){
                    //把类名实例化成对象
                    $otherObj = new $class;  
                    $otherObj->save($parameter);
                }
            }
        }
    }
    

    调用:

    //调用开始
    $zj = new ZhoneJie;  //new以后返回一个中介的对象,然后把这个对象传入到下面去,对象也可以当变量使用
    $cd = new CD($zj);
    $cd->change();

     

posted @ 2015-09-08 17:48  笑笑别人  阅读(801)  评论(0编辑  收藏  举报