zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    查看windows下指定的端口是否开放
    网易云音乐评论爬虫:爬取歌曲的全部评论
    用 Python 玩转 GitHub 的贡献板
    用python实现linux口令破解
    Python 音频数据扩充的技巧
    教你使用python+Opencv完成人脸解锁
    opencv+Python特征检测及K-最近邻匹配
    opencv+python 统计及绘制直方图
    学会用这个工具做分析,1年积累3年工作经验
    15分钟,教你用Python爬网站数据,并用BI可视化分析!
  • 原文地址:https://www.cnblogs.com/mr-amazing/p/4792466.html
Copyright © 2011-2022 走看看