<?php
/*
* 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互
*/ /*
* 以一个同学qq群为例说明,qq作为中介者,同学作为相互交互的对象
*/ //抽象中介者,利用中介发送消息
abstract class Mediator{
abstract function send($message,$user);
} //抽象同事类,利用中介发送消息
abstract class Colleague{
private $mediator; public function __construct($mediator){
$this->mediator = $mediator;
} public function send($message){
$this->mediator->send($message,$this);
} abstract function notify($message);
} //具体的同事类a b c d e
class StuA extends Colleague{
public function notify($message){
echo 'Stu A says: '.$message;
echo "<br/>";
}
} class StuB extends Colleague{
public function notify($message){
echo 'Stu B says: '.$message;
echo "<br/>";
}
} class StuC extends Colleague{
public function notify($message){
echo 'Stu C says: '.$message;
echo "<br/>";
}
} class StuD extends Colleague{
public function notify($message){
echo 'Stu D says: '.$message;
echo "<br/>";
}
} class StuE extends Colleague{
public function notify($message){
echo 'Stu E says: '.$message;
echo "<br/>";
}
} //具体的中介者
class QQ extends Mediator{
public $users = array(); public function setUsers($user){//把对象添加进来
$this->users[] = $user;
} public function send($message, $user){//推送消息
for($i=0;$i<count($this->users);$i++){
if($user == $this->users[$i]){
$this->users[$i]->notify($message);
}
}
}
} class Client{
public static function main(){
//流程:先建立中介者
$qq = new QQ();
//实例化交互对象
$stu_a = new StuA($qq);
$stu_b = new StuB($qq);
$stu_c = new StuC($qq);
$stu_d = new StuD($qq);
$stu_e = new StuE($qq);
//把对象加入中介者
$qq->setUsers($stu_b);
$qq->setUsers($stu_a);
$qq->setUsers($stu_c);
$qq->setUsers($stu_d);
$qq->setUsers($stu_e); //交流
$stu_a->send('昨天点名了吗,各位大神');
$stu_c->send('难道你没去');
$stu_a->send('是啊');
$stu_b->send('恭喜你中奖了');
$stu_d->send('恭喜你中奖了');
$stu_e->send('恭喜你中奖了');
$stu_a->send('我去');
}
} Client::main();
?>

  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. 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...

  2. xamarin UWP自定义圆角按钮

    uwp自带的button本身不支持圆角属性,所以要通过自定义控件实现. 通过设置Button的Background=“{x:Null}”设置为Null使背景为空,再设置Button.Content中的 ...

  3. 初学者--bootstrap(三)下载与安装----在路上(7)

    ----------------------------------------对于学习与工作者来说用压缩版,若是研究框架则用源代码---------------------------------- ...

  4. Session for SSRS Report of Microsoft Dynamics AX

    Session for SSRS Report of Microsoft Dynamics AX 版权声明:本文为博主原创文章,未经博主允许不得转载. Contract •A data contrac ...

  5. OpenCASCADE Conic to BSpline Curves-Hyperbola

    OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...

  6. Python标准模块--collections

    1.模块简介 collections包含了一些特殊的容器,针对Python内置的容器,例如list.dict.set和tuple,提供了另一种选择: namedtuple,可以创建包含名称的tuple ...

  7. 静态Include和动态Include测试并总结

    主要代码 hjzgg.css .center-div{ width:auto; margin-left: 40%; margin-right: 40%; display: block; positio ...

  8. 校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  9. Bootstrap Metronic 学习记录(一)简介

    1.简介 是一个基于Bootstrap 3.x的高级管理控制面板主题.Bootstrap Metronic - 是一个完全响应式管理模板.基于Bootstrap3框架.高度可定制的,易于使用.适合从小 ...

  10. MySQL学习笔记之MySQL安装详解

    前言 虽然现在NoSQL发展迅速,但MySQL还是非常受欢迎的,成千上万的公司依旧采用LAMP OR LNMP的搭配来进行开发,因此MYSQL的学习还是有一定的必要. 安装环境:Windows 7,需 ...