• 中介者模式

中介者模式用于开发一个对象,这个对象能够在类似对象相互之间不直接相互的情况下传送或者调解对这些对象的集合的修改。一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式。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();

php模式设计之 中介者模式的更多相关文章

  1. 《JAVA与模式》之中介者模式(转载)

    原文出处:http://blog.csdn.net/zhengzhb/article/details/7430098   定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用 ...

  2. php模式设计之 注册树模式

    在前两篇单例模式和工厂模式后,终于迎来了最后一个基础的设计模式--注册树模式. 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更 ...

  3. php 23种设计模型 - 中介者模式

    中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...

  4. 调停者模式Mediator(中介者模式)详解

    原文链接:https://www.cnblogs.com/java-my-life/archive/2012/06/20/2554024.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  5. 设计模式-行为型模式,python 中介者模式

    中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行 ...

  6. 【编程思想】【设计模式】【行为模式Behavioral】中介者模式Mediator

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/mediator.py #!/usr/bin/env py ...

  7. 深入浅出设计模式——中介者模式(Mediator Pattern)

    模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...

  8. iOS设计模式之中介者模式

    中介者模式 基本理解 中介者模式又叫做调停者模式,其实就是中间人或者调停者的意思. 尽管将一个系统分割成许多对象通常可以增加可复用性,但是对象之间的连接又降低了可复用性. 如果两个类不必彼此直接通信, ...

  9. 24种设计模式--中介者模式【Mediator Pattern】

    各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一 ...

随机推荐

  1. css 内联与块

    内联元素可以理解为不能直接设置宽度和高度元素,比如span,你为他设置宽度和高度没有效果,除非你把它设置成块级元素. 如下面的代码把display:block;属性值去掉的话,宽度和高度都不会起作用了 ...

  2. ArrayList和数组间的相互转换

    开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子: package test.test1; import java.util.ArrayList; import java.util.L ...

  3. JSON & XML 简析

    转载自:http://my.oschina.net/aofe/blog/269260 JSON: XML: JSON格式说明: HTML & XML 的对比 HTML: XML: HTML5新 ...

  4. UML基础概念(转)

    UML基础概念 UML概述 uml简介 uml(unified Modeling Language )为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的 ...

  5. Mac os 10.11 更新ruby

    1.装cocoapods,ruby版本忒低->开始更新ruby->开始更新gem,这是一条不归路啊同志们,各种permission denied,各种路径不存在,各种路径没有读写权限,各种 ...

  6. JSONObject转换JSON之将Date转换为指定格式(转)

    项目中,经常会用JSONObject插件将JavaBean或List<JavaBean>转换为JSON格式的字符串,而JavaBean的属性有时候会有java.util.Date这个类型的 ...

  7. hibetnateTemplate常用方法

    一.hibetnateTemplate常用方法 1.delete(Object entity) 删除指定的持久化实例在程序中一般先用    Assert.notNull和 Assert.isTrue断 ...

  8. Init.rc分析(刘举奎)

    http://www.360doc.com/content/14/0926/20/13253385_412582822.shtml

  9. PAT (Advanced Level) 1003. Emergency (25)

    最短路+dfs 先找出可能在最短路上的边,这些边会构成一个DAG,然后在这个DAG上dfs一次就可以得到两个答案了. 也可以对DAG进行拓扑排序,然后DP求解. #include<iostrea ...

  10. POJ 2976 Dropping tests 01分数规划 模板

    Dropping tests   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6373   Accepted: 2198 ...