php中介者,中介者模式(Mediator)

3.4.1. 目的

本模式提供了一种轻松的多组件之间弱耦合的协同方式。如果你有个“情报中心”,观察者模式也是个好选择,类似于控制器(并非 MVC 意义上的控制器)。

所有关联协同的组件(称作 Colleague)仅与 MediatorInterface 接口建立耦合,面向对象编程中这是好事,一个良友胜于有多个朋友。这是该模式的重要特性。

3.4.2. UML 图

5a06e928d0f96076c67007d0da381444.png

3.4.3. 代码

MediatorInterface.php

namespace DesignPatterns\Behavioral\Mediator;

/**

* MediatorInterface 接口为 Mediator 类建立契约

* 该接口虽非强制,但优于 Liskov 替换原则。

*/

interface MediatorInterface

{

/**

* 发出响应

*

* @param string $content

*/

public function sendResponse($content);

/**

* 做出请求

*/

public function makeRequest();

/**

* 查询数据库

*/

public function queryDb();

}

Mediator.php

namespace DesignPatterns\Behavioral\Mediator;

/**

* Mediator 是用于访设计模式的中介者模式的实体

*

* 本示例中,我用中介者模式做了一个 “Hello World” 的响应

*/

class Mediator implements MediatorInterface

{

/**

* @var Subsystem\Server

*/

private $server;

/**

* @var Subsystem\Database

*/

private $database;

/**

* @var Subsystem\Client

*/

private $client;

/**

* @param Subsystem\Database $database

* @param Subsystem\Client $client

* @param Subsystem\Server $server

*/

public function __construct(Subsystem\Database $database, Subsystem\Client $client, Subsystem\Server $server)

{

$this->database = $database;

$this->server = $server;

$this->client = $client;

$this->database->setMediator($this);

$this->server->setMediator($this);

$this->client->setMediator($this);

}

public function makeRequest()

{

$this->server->process();

}

public function queryDb(): string

{

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

{

/**

* 确保子类不变化。

*

* @var MediatorInterface

*/

protected $mediator;

/**

* @param MediatorInterface $mediator

*/

public function setMediator(MediatorInterface $mediator)

{

$this->mediator = $mediator;

}

}

Subsystem/Client.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

/**

* Client 类是一个发出请求并获得响应的客户端。

*/

class Client extends Colleague

{

public function request()

{

$this->mediator->makeRequest();

}

public function output(string $content)

{

echo $content;

}

}

Subsystem/Database.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

class Database extends Colleague

{

public function getData(): string

{

return 'World';

}

}

Subsystem/Server.php

namespace DesignPatterns\Behavioral\Mediator\Subsystem;

use DesignPatterns\Behavioral\Mediator\Colleague;

class Server extends Colleague

{

public function process()

{

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

$this->mediator->sendResponse(sprintf("Hello %s", $data));

}

}

3.4.4. 测试

Tests/MediatorTest.php

namespace DesignPatterns\Tests\Mediator\Tests;

use DesignPatterns\Behavioral\Mediator\Mediator;

use DesignPatterns\Behavioral\Mediator\Subsystem\Client;

use DesignPatterns\Behavioral\Mediator\Subsystem\Database;

use DesignPatterns\Behavioral\Mediator\Subsystem\Server;

use PHPUnit\Framework\TestCase;

class MediatorTest extends TestCase

{

public function testOutputHelloWorld()

{

$client = new Client();

$client->setMediator(new Mediator(new Database(), $client, new Server()));

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

$client->request();

}

}

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接

我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值