php中介者,PHP设计模式 - 中介者模式

【一】模式定义

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

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

【二】UML类图

9794e52594b22dea7807f10e4f0e54de.png

【三】示例代码

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();

}

}

【五】总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dedecms模版php,dedecms专题模板怎么用

dedecms专题模板怎么用?DeDeCms的专题相关信息bbs上相对较少,之前查阅了很多资料都未找到其解决方案推荐学习:织梦cms无柰只有靠自己动手丰衣足食;在官方的版本上有这样的一段话:1、文章列表用ID1,ID2,ID3这样形式分开…

Windows中断那些事儿

搞内核研究的经常对中断这个概念肯定不陌生,经常我们会接触很多与中断相关的术语,按照软件和硬件进行分类: 硬件CPU相关: IRQ、IDT、cli&sti 软件操作系统相关: APC、DPC、IRQL 一直以来对中断这一部分内容弄的一知…

(1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念的。 一个领域就是一个小型的MVC项目,所以领域…

重启模块与及关开邮件存储设置功能页面-PHP-shell-py

邮件系统几百台,每台负责 grep -P "^ip\d.\d." /home/mymail/newconf/hosts.conf -c465 每台机器负责启动的模块又是不一样的如: A机器: ProgramsList"1svr,2svr,3svr,4svr," b机器: ProgramsList"asvr,…

用IIS配置反向代理

https://natapp.cn/ http://blog.csdn.net/g2321514568/article/details/12406755 目标服务器:targetServer 配置反向代理的服务器:reveseProxServer 1、确定最终访问的网址:比如www.baidu.com 、www.csdn.net等等。 当然你也可以自己在targ…

oracle存储过程使用ftp,ASM存储FTP上传文件

引用SQL>execute dbms_xdb.sethttpport(8080);SQL>execute dbms_xdb.setftpport(2100);SQL>commit;检查端口是否开启引用SQL> select dbms_xdb.GETHTTPPORT() from dual;DBMS_XDB.GETHTTPPORT()----------------------8080SQL> select dbms_xdb.GETFTPPORT() fr…

Python学习笔记——基础篇【第六周】——hashlib模块

常用模块之hashlib模块  用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import md5 hash md5.new() hash.update(admin) print hash.hexdigest() MD5-废弃import shahash sha…

虚拟存储

为解决日益增长的内存需要,有以下几种解决办法: 1.覆盖: 将程序划分成几个模块,将没有调用关系的模块(即不会同时运行的模块)分成一组,其中每组所占的内存大小为组内所需内存最大的模块的内存&a…

作为前端应当了解的Web缓存知识

缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备。对于前端开发者来说,浏览器充当了重要角色。除此外常见的还有各种各样的代理服务器也可以做缓存。当Web请求到达缓存时,缓存从本地副本中提取这个副本内容而不需要经过服务器。…

linux 提取日志字段,记一次Linux下提取MySQL日志关键字段

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?环境说明操作系统:centos7sed版本:4.2.2egrep版本:2.20paste版本:8.22提取要求一次同事说,需要提取MySQ…

1x1 11b g n linux,基于RN1810下的2.4 GHz IEEE 802.11b/g/n无线模块

特性• 符合IEEE 802.11b/g/n的收发器• 2.4 GHz IEEE 802.11n单流1x1• 与主机控制器的UART接口(4线,包括RTS/CTS)• 易于集成到最终产品中——最大程度地减少产品开发工作量,缩短上市时间• 使用简单的ASCII命令进行配置• 带稳压电路、晶振、RF匹配电…

!!“理都懂”为什么“然并卵”?

“理都懂”为什么“然并卵”? 脑子有话讲 收藏(176)| 阅读(17980)以前看见过别人问过这么一个问题:「为什么我们懂得很多道理,却依然过不好这一生?」 知乎上有很多这个问题的不同版本,但其实都说的是同一个事情&#…

linux终端模拟器app下载,3C终端模拟器app下载-3C终端模拟器v0.9最新版下载 - 91手游网...

应用介绍3C终端模拟器是一个终端模拟的app,风格多变,轻松好用,还有功能各异的语句等你来试验,可以在其中运行属于你自己的脚本内容,并且这个软件是不限定使用的,这也就意味着你是否有ROOT并不影响这个软件的…

【VS开发】static、extern分析总结

引用请注明出处:http://blog.csdn.net/int64ago/article/details/7396325 对于写了很多小程序的人,可能static和extern都用的很少,因为static和extern通常在工程量很大时候才能体现优势很必要性,这就不奇怪linux内核代码中“泛滥”…

android 画布心形,Android CustomShapeImageView对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等...

Android CustomShapeImageView对图片进行各种样式裁剪:圆形、星形、心形、花瓣形等Android CustomShapeImageView是github上一个第三方开源的对图片进行各种样式裁剪的库,其要实现的功能如图所示:Android CustomShap…

iOS开发UI篇-在UItableview中实现加载更多功能

iOS开发UI篇-在UItableview中实现加载更多功能 一、实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据。 二、实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面&#…

ublox Android 定位超时,[RK3288] [Android 7.1] u-blox GPS调试

我这里GPS使用的是TTL串口GPS芯片,用的是uart01.确认原理图对应的uart节点,将其打开&uart0 {status "okay";dma-names "!tx", "!rx";pinctrl-0 ;};2.在hal层编译出 gps.default.so 目录在hardware/rockchip/gps/有的目录下自带…

1.4Activity保存现场状态

概念: 保存Activity的状态是非常重要的,例如我们在玩一个游戏的时候,突然来了一个电话,这个时候在接听完电话之后我们返回到游戏中,这个时候我们希望游戏还是之前那个进度,或者说发生突发事件,游戏这个应用…

鸿蒙系统什么时候超过苹果,为何任正非说鸿蒙系统想超过苹果系统需要的时间,不会超过300年...

还记得任正非的一段话:华为操作系统要想超安卓苹果,需要很长时间,但不会超过 300 年。我相信这段话并不是说华为系统要超过苹果手机,需要300年的时间。任正非只是解释了华为系统目前和安卓系统以及苹果系统还有一定的差距&#xf…

android开发设计平台,10款开发和设计应该安装的android应用

过去几年里有很多新开发的小工具出现,人们的生活越来越离不开智能机,当然包括android手机,它已经成为了人们的最大需求量之一,市场上出现的android手机也越来越多,人们也比较喜欢用andorid手机。因为相对而言&#xff…