【一】模式定义

中介者模式(Mediator)就是用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

对于中介对象而言,所有相互交互的对象,都视为同事类,中介对象就是用来维护各个同事对象之间的关系,所有的同事类都只和中介对象交互,也就是说,中介对象是需要知道所有的同事对象的。当一个同事对象自身发生变化时,它是不知道会对其他同事对象产生什么影响,它只需要通知中介对象,“我发生变化了”,中介对象会去和其他同事对象进行交互的。这样一来,同事对象之间的依赖就没有了。有了中介者之后,所有的交互都封装在了中介对象里面,各个对象只需要关心自己能做什么就行,不需要再关心做了之后会对其他对象产生什么影响,也就是无需再维护这些关系了。

【二】UML类图

【三】示例代码

MediatorInterface.php

namespace DesignPatterns\Behavioral\Mediator;

/**

* MediatorInterface是一个中介者契约

* 该接口不是强制的,但是使用它更加符合里氏替换原则

*/

interface MediatorInterface

{

/**

* 发送响应

*

* @param string $content

*/

public function sendResponse($content);

/**

* 发起请求

*/

public function makeRequest();

/**

* 查询数据库

*/

public function queryDb();

}

Mediator.php

namespace DesignPatterns\Behavioral\Mediator;

use DesignPatterns\Behavioral\Mediator\Subsystem;

/**

* Mediator是中介者模式的具体实现类

* In this example, I have made a "Hello World" with the Mediator Pattern.

*/

class Mediator implements MediatorInterface

{

/**

* @var Subsystem\Server

*/

protected $server;

/**

* @var Subsystem\Database

*/

protected $database;

/**

* @var Subsystem\Client

*/

protected $client;

/**

* @param Subsystem\Database $db

* @param Subsystem\Client   $cl

* @param Subsystem\Server   $srv

*/

public function setColleague(Subsystem\Database $db, Subsystem\Client $cl, Subsystem\Server $srv)

{

$this->database = $db;

$this->server = $srv;

$this->client = $cl;

}

/**

* 发起请求

*/

public function makeRequest()

{

$this->server->process();

}

/**

* 查询数据库

* @return mixed

*/

public function queryDb()

{

return $this->database->getData();

}

/**

* 发送响应

*

* @param string $content

*/

public function sendResponse($content)

{

$this->client->output($content);

}

}

Colleague.php

namespace DesignPatterns\Behavioral\Mediator;

/**

* Colleague是一个抽象的同事类,但是它只知道中介者Mediator,而不知道其他同事

*/

abstract class Colleague

{

/**

* this ensures no change in subclasses

*

* @var MediatorInterface

*/

private $mediator;

/**

* @param MediatorInterface $medium

*/

public function __construct(MediatorInterface $medium)

{

$this->mediator = $medium;

}

// for subclasses

protected function getMediator()

{

return $this->mediator;

}

}

Subsystem/Client.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

/**

* Client是发起请求&获取响应的客户端

*/

class Client extends Colleague

{

/**

* request

*/

public function request()

{

$this->getMediator()->makeRequest();

}

/**

* output content

*

* @param string $content

*/

public function output($content)

{

echo $content;

}

}

Subsystem/Database.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

/**

* Database提供数据库服务

*/

class Database extends Colleague

{

/**

* @return string

*/

public function getData()

{

return "World";

}

}

Subsystem/Server.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

/**

* Server用于发送响应

*/

class Server extends Colleague

{

/**

* process on server

*/

public function process()

{

$data = $this->getMediator()->queryDb();

$this->getMediator()->sendResponse("Hello $data");

}

}

【四】测试代码

Tests/MediatorTest.php

namespace DesignPatterns\Tests\Mediator\Tests;

use DesignPatterns\Behavioral\Mediator\Mediator;

use DesignPatterns\Behavioral\Mediator\Subsystem\Database;

use DesignPatterns\Behavioral\Mediator\Subsystem\Client;

use DesignPatterns\Behavioral\Mediator\Subsystem\Server;

/**

* MediatorTest tests hello world

*/

class MediatorTest extends \PHPUnit_Framework_TestCase

{

protected $client;

protected function setUp()

{

$media = new Mediator();

$this->client = new Client($media);

$media->setColleague(new Database($media), $this->client, new Server($media));

}

public function testOutputHelloWorld()

{

// 测试是否输出 Hello World :

$this->expectOutputString('Hello World');

// 正如你所看到的, Client, Server 和 Database 是完全解耦的

$this->client->request();

}

}

【五】总结

中介者主要是通过中介对象来封装对象之间的关系,使之各个对象在不需要知道其他对象的具体信息情况下通过中介者对象来与之通信。同时通过引用中介者对象来减少系统对象之间关系,提高了对象的可复用和系统的可扩展性。但是就是因为中介者对象封装了对象之间的关联关系,导致中介者对象变得比较庞大,所承担的责任也比较多。它需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出问题。

php中介者,PHP设计模式 - 中介者模式相关推荐

  1. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  2. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  3. 大话设计模式—中介者模式

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

  4. 设计模式-行为型模式-中介者模式

    设计模式-行为型模式-中介者模式 行为型模式 划分类和对象的职责. 中介者模式 进销存管理,即采购,销售,库存. 其中类图 代码如下 public class Purchase {// 采购IBM电脑 ...

  5. 7. 星际争霸之php设计模式--中介者模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  6. 23种设计模式----中介者模式----行为型模式

    中介者模式 1.什么是中介者模式 2.中介者模式的角色 3.例子 3.1 项目结构 3.2 共同实体 3.3 抽象的中介者 3.4 抽象的被中介者 3.5 具体的中介者 3.6 具体的被中介者 3.7 ...

  7. 一天一个设计模式---中介者模式

    介绍:用一个中介对象来封装对象的交互,中介者使各对象不需要显示地引用,从而使其耦合松散,而且可以独立地改变他们的交互. 场景:举个生活中的例子,如果我们去租房子,我们会将各个房源的价格留下来,等每次价 ...

  8. 【设计模式】Java设计模式 - 中介者模式

    Java设计模式 - 中介者模式

  9. 设计模式 | 中介者模式及典型应用

    本文的主要内容: 介绍中介者模式 数据同步示例 中介者模式总结 源码分析中介者模式的典型应用 Java Timer 中的中介者模式 中介者模式 世界上存在着各种各样的数据库,不同数据库有各自的应用场景 ...

最新文章

  1. android studio写坦克大战代码_GitHub 项目推荐:俄罗斯小游戏、Markdown 幻灯片、头像生成器、Logo 制作、坦克大战...
  2. 如何把代码写的优雅一些
  3. WPF-MVVM学习心德(WinForm转WPF心德)
  4. python画父子关系图_将有父子关系的一维数组转换成树形结构(多维)数据
  5. 500道Java 必备面试题答案(过后即删)
  6. Linux bash符号及含义,Linux下用bash命令执行名称中带有(符号的目录注意事项
  7. java logic逻辑,logicJava的复习
  8. 记录——《C Primer Plus (第五版)》第七章编程练习第八题
  9. [算法模板]莫比乌斯反演
  10. linux 常用命令 -- 系统管理工具包: 监视邮件的使用情况
  11. java将录音转换成文字,除了把录音转换成文字,原来录音转文字助手还有这么多实用功能...
  12. 中秋节主题征文 | 那些不朽的描写月亮的诗词
  13. V831 修改启动默认文件
  14. 滴滴笔试毕业旅行——回溯法(dfs)
  15. mixwit怀旧磁带音乐盒
  16. 计算机毕业设计JavaVue框架电商后台管理系统(源码+系统+mysql数据库+lw文档)
  17. 交换机的端口工作模式一般可以分为三种:Access,Multi,Trunk。
  18. python 10行代码生成词云图片(基础词云、形状词云)
  19. Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins:mav问题
  20. 小米平板android版本,小米平板系统是什么?小米平板能升级安卓4.2吗?

热门文章

  1. Android自定义view详解,使用实例,自定义属性,贝塞尔曲线
  2. Android 生成随机数,获取一条随机字符串
  3. QC与WIN7、IE8 兼容问题解决方案
  4. java des对称加密_JAVA加密解密DES对称加密算法
  5. JAVA8 ARRAY、LIST操作 汇【5】)- JAVA8 LAMBDA LIST统计(求和、最大、最小、平均)
  6. 管理linux中文件共享,Linux操作系统文件管理器的共享
  7. 实验16 编写包含多个功能子程序的中断例程
  8. 【C++深度剖析教程29】C++对象模型分析下
  9. Makefile工程管理语法与使用技巧
  10. [USACO 2017 Feb Gold] Tutorial