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,一经查实,立即删除!

相关文章

java 自定义标签 rtexprvalue,java自定义标签

三步:一、自定义标签实现类: myTags.java;二、自定义标签库文件(TLD): myTags.tld;三、一个JSP页面:随便写了;首先myTags.javapackage com.tags;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.ser…

Enum遇到下拉框

package com.zj.tool;public enum WeekDay {Mon("Monday",1),Tue("Tuesday",2),Wed("Wednesday",3),Thu("Thursday",4),Fri("Friday",5),Sat("Saturday",6),Sun("Sunday",7);/**定义枚举类型自己的属性…

dede plus ad js.php,织梦dedecms/plus/文件夹的功能介绍

/plus /–插件及辅助功能目录后台系统插件和辅助功能文件存放目录,你有什么辅助功能或者第三方开发的插件你需要用那么久需要放在这个文件夹中,文件夹中有dedecms自带的常用插件:plus 系统插件存放目录guestbook 留言板插件ad_js.php 广告…

今天觉得自己好像比较紧张

因为每天早上都是想着公司的事情,就怕自己做不成什么就早早的醒了,有时还要继续睡 转载于:https://www.cnblogs.com/bkchengzheng/p/5500224.html

vertex shader(5)

先挖个坑 ,以后填。。。转载于:https://www.cnblogs.com/ll-10/p/5502767.html

php 固话验证,收货地址参数校验:收货人、邮编、地址、手机、固话等

收货地址参数校验&#xff1a;收货人、邮编、地址、手机、固话等.收货人&#xff1a;function checkshr() {var shr $(#shr).val();if (shr.length < 0) {$(#shrmsg).show().html(\u6536\u8d27\u4eba\u4e0d\u80fd\u4e3a\u7a7a!);return false;}if (shr.length 14) {$(#shr…

php获取悉尼时间,php在使用澳大利亚/悉尼时区时给出错误答案

为什么它说5,为什么这在技术上是正确的在Sydney,DST开始于2013-10-06 02:00:00 – 所以你跨越那个日期会失去一个小时.当你调用strtime时,它会将时间解释为悉尼时间,但返回一个Unix时间戳.如果您将第二组时间戳转换为UTC,则会得到2013-09-30 14:00:00到2013-10-06 13:00:00的范…

动画---图形图像与动画(三)Animation效果的XML实现

使用XML来定义Tween Animation 动画的XML文件在工程中res/anim目录&#xff0c;这个文件必须包含一个根元素&#xff0c;可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入<set>元素组中&#xff0c;默认情况下&#…

java怎么输出点,Java实现控制台输出两点间距离

计算两点之间的距离然后在控制台输出&#xff0c;这个题目还是挺简单的。下面我们来看看具体代码。package com.swift;import java.util.Scanner;public class PToP {public static void main(String[] args) {Scanner scannew Scanner(System.in);System.out.println("请…

bzoj 2905 背单词

Description 给定一张包含N个单词的表&#xff0c;每个单词有个价值W。要求从中选出一个子序列使得其中的每个单词是后一个单词的子串&#xff0c;最大化子序列中W的和。 Input 第一行一个整数TEST&#xff0c;表示数据组数。 接下来TEST组数据&#xff0c;每组数据第一行为一…

php的gd库处理大的图片,PHP的gd库处理图片

gd库为图片加文字水印和图片输出$number $result[certno];//设置水印内容$file ./Uploads/certs/ . $number . .jpg;if(!is_file($file)){$src ./template/public/img/zhengshu.jpg;//定义图片地址$info getimagesize($src);//获取图片信息$type image_type_to_extension(…

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

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

Windows中断那些事儿

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

php值对象模式场景,php设计模式介绍之值对象模式第1/5页

例如&#xff1a;通常用一个对象描述一个日期、一个数字或者货币。日期、整数或美元的类定义是都是便于使用的、快捷、便于封装的&#xff0c;并且方便进行拷贝&#xff0c;相互比较&#xff0c;甚至是创建。 从表面上看&#xff0c;这些描述简单的对象很容易被执行&#xff1a…

5月17日 AJAX 之 XML

主页面&#xff1a; <head> <script src"../jquery-2.2.3.min.js"></script> </head><body> <select id"sel"></select> </body> <script type"text/javascript"> $(document).ready(fun…

oracle 修改字段长度 用时,Oracle修改字段长度以及计算天数

sql修改字段长度的语法&#xff1a;alter table 表名 modify 字段名 字段类型;sql修改字段长度的示例代码alter table qtline modify qtl_bidernote VARCHAR2(4000);标准SQL&#xff0c;对任何数据库都适用alter table fzrtmis.reporttemplate modify REPNAME varchar(100)&…

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

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

oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...

1、使用SYS用户以SYSDBA身份登录到SQL Plus&#xff0c;使用视图V$TABLESPACE查看表空间信息SELECT * FROM V$TABLESPACE;2、查看视图DBA_TABLESPACES查看所有表空间的属性和在线状态SELECT TABLESPACE_NAME, CONTENTS, STATUSFROMDBA_TABLESPACES;--表空间名&#xff0c;表空间…

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

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

oracle 表达式1000,oracle环境下占用编号的方法报语法错误:ORA-01795: 列表中的最大表达式数为 1000...

oracle 环境下&#xff0c;调用方法NumberCodeGenerateManager.OcuppyModelNumberCodesAfterSaved(ObjectID, modelID, ds)进行编号占用。当DataSet的数据行数〉1000时&#xff0c;会报语法错误&#xff1a;ORA-01795: 列表中的最大表达式数为 1000。跟踪语句如下&#xff1a;u…