1. <?php
  2. /*
  3. * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互
  4. */
  5.  
  6. /*
  7. * 以一个同学qq群为例说明,qq作为中介者,同学作为相互交互的对象
  8. */
  9.  
  10. //抽象中介者,利用中介发送消息
  11. abstract class Mediator{
  12. abstract function send($message,$user);
  13. }
  14.  
  15. //抽象同事类,利用中介发送消息
  16. abstract class Colleague{
  17. private $mediator;
  18.  
  19. public function __construct($mediator){
  20. $this->mediator = $mediator;
  21. }
  22.  
  23. public function send($message){
  24. $this->mediator->send($message,$this);
  25. }
  26.  
  27. abstract function notify($message);
  28. }
  29.  
  30. //具体的同事类a b c d e
  31. class StuA extends Colleague{
  32. public function notify($message){
  33. echo 'Stu A says: '.$message;
  34. echo "<br/>";
  35. }
  36. }
  37.  
  38. class StuB extends Colleague{
  39. public function notify($message){
  40. echo 'Stu B says: '.$message;
  41. echo "<br/>";
  42. }
  43. }
  44.  
  45. class StuC extends Colleague{
  46. public function notify($message){
  47. echo 'Stu C says: '.$message;
  48. echo "<br/>";
  49. }
  50. }
  51.  
  52. class StuD extends Colleague{
  53. public function notify($message){
  54. echo 'Stu D says: '.$message;
  55. echo "<br/>";
  56. }
  57. }
  58.  
  59. class StuE extends Colleague{
  60. public function notify($message){
  61. echo 'Stu E says: '.$message;
  62. echo "<br/>";
  63. }
  64. }
  65.  
  66. //具体的中介者
  67. class QQ extends Mediator{
  68. public $users = array();
  69.  
  70. public function setUsers($user){//把对象添加进来
  71. $this->users[] = $user;
  72. }
  73.  
  74. public function send($message, $user){//推送消息
  75. for($i=0;$i<count($this->users);$i++){
  76. if($user == $this->users[$i]){
  77. $this->users[$i]->notify($message);
  78. }
  79. }
  80. }
  81. }
  82.  
  83. class Client{
  84. public static function main(){
  85. //流程:先建立中介者
  86. $qq = new QQ();
  87. //实例化交互对象
  88. $stu_a = new StuA($qq);
  89. $stu_b = new StuB($qq);
  90. $stu_c = new StuC($qq);
  91. $stu_d = new StuD($qq);
  92. $stu_e = new StuE($qq);
  93. //把对象加入中介者
  94. $qq->setUsers($stu_b);
  95. $qq->setUsers($stu_a);
  96. $qq->setUsers($stu_c);
  97. $qq->setUsers($stu_d);
  98. $qq->setUsers($stu_e);
  99.  
  100. //交流
  101. $stu_a->send('昨天点名了吗,各位大神');
  102. $stu_c->send('难道你没去');
  103. $stu_a->send('是啊');
  104. $stu_b->send('恭喜你中奖了');
  105. $stu_d->send('恭喜你中奖了');
  106. $stu_e->send('恭喜你中奖了');
  107. $stu_a->send('我去');
  108. }
  109. }
  110.  
  111. Client::main();
  112. ?>

  UML类图如下

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

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  3. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  4. 【GOF23设计模式】中介者模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...

  5. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  6. 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)

    中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...

  7. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  8. PHP设计模式系列 - 中介者模式

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

  9. 深入理解JavaScript系列(36):设计模式之中介者模式

    介绍 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要内容来自:http://www ...

  10. Java 设计模式之中介者模式

    本文继续23种设计模式系列之中介者模式.   定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互.   角色 抽象中介者: ...

随机推荐

  1. Node.js返回JSONP

    在使用JQuery的Ajax从服务器请求数据或者向服务器发送数据时常常会遇到跨域无法请求的错误,常用的解决办法就是在Ajax中使用JSONP.基于安全性考虑,浏览器会存在同源策略,然而<scri ...

  2. TDR测试原理

    什么是TDR? TDR是英文Time Domain Reflectometry 的缩写,中文名叫时域反射计,是测量传输线特性阻抗的主要工具.TDR主要由三部分构成:快沿信号发生器,采样示波器和探头系统 ...

  3. Android笔记——数据库升级与降级

    一.概述 SQLite是Android内置的一个很小的关系型数据库.SQLiteOpenHelper是一个用来辅助管理数据库创建和版本升级问题的抽象类.我们可以继承这个抽象类,实现它的一些方法来对数据 ...

  4. webpack的安装和使用

    Webpack是什么 首先可以看下 官方文档 ,文档是最好的老师. Webpack是由Tobias Koppers开发的一个开源前端模块构建工具.它的基本功能是将以模块格式书写的多个JavaScrip ...

  5. Trace2:创建SQL Trace

    Trace是轻量级的追踪工具,几乎对系统没有任何副作用,开启Trace,经常能够帮助DBA追踪到一些非常有用的信息.Trace出现的比较早,MS推出更强大的Extended Events来取代Trac ...

  6. Sql Server系列:视图

    视图是数据库中的一种虚拟表,与真实的表一样,视图包含一系列带有名称的行和列数据.行和列数据用来自定义视图的查询所引用的表,并且在引用视图时动态生成. 1. 视图的概念 视图是从一个或者多个表中导出的, ...

  7. Python标准模块--linecache

    1.模块简介 linecache主要用于缓存文件内容,如果下次继续读取该文件,则不需要打开文件,直接在缓存中获取该文件内容. 2.模块使用 模块的基本方法有getline,clearcache,get ...

  8. JavaScript框架设计(四) 字符串选择器(选择器模块结束)

    JavaScript框架设计(四) 字符串选择器(选择器模块结束) 经过前面JavaScript框架设计(三) push兼容性和选择器上下文的铺垫,实现了在某一元素下寻找,现在终于进入了字符串选择器 ...

  9. java 中多线程的同步函数的运用

    /* * 需求: * 银行有一个金库 * 有两个储户,分别存300元.每次存100 , 存三次 * * 这个是有线程问题的, * * 我们应该通过下边的三个方法来查找问题 * 1.明确哪些代码是多线程 ...

  10. 移动端上传照片 预览+Draw on Canvas's Demo(解决 iOS 等设备照片旋转 90 度的 bug)

    背景: 本人的一个移动端H5项目,需求如下: 需求一:手机相册选取或拍摄照片后在页面上预览 需求二:然后绘制在canvas画布上 这里,我们先看一个demo(http://jsfiddle.net/q ...