Посередник (англ. Mediator) — поведінковий шаблон проєктування, що забезпечує взаємодію безлічі об’єктів,
формуючи при цьому слабку пов’язаність і позбавляючи об’єкти необхідності явно посилатися один на одного.
Це хороша альтернатива спостерігачеві, якщо у вас є “центр інтелекту” на кшталт контролера (але не в сенсі MVC).
Усі компоненти (називаються “Колеги”) об’єднуються в Mediator, і це добре, тому що, в рамках ООП, “Старий друг краще нових двох”.
-
Client.php
<?php namespace DesignPatterns\Behavioral\Mediator; class Client extends Colleague { public function request() { $this->mediator->makeRequest(); } public function output(string $content) { echo $content; } }
-
Colleague.php
<?php namespace DesignPatterns\Behavioral\Mediator; abstract class Colleague { /** * @var Mediator */ protected $mediator; public function setMediator(Mediator $mediator) { $this->mediator = $mediator; } }
-
Database.php
<?php namespace DesignPatterns\Behavioral\Mediator; class Database extends Colleague { public function getData(): string { return 'World'; } }
-
Mediator.php
<?php namespace DesignPatterns\Behavioral\Mediator; class Mediator { private $server; private $database; private $client; public function __construct(Database $database, Client $client, 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(); } public function sendResponse($content) { $this->client->output($content); } }
-
Server.php
<?php namespace DesignPatterns\Behavioral\Mediator; class Server extends Colleague { public function process() { $data = $this->mediator->queryDb(); $this->mediator->sendResponse(sprintf("Hello %s", $data)); } }
Test case:
MediatorTest.php
<?php
namespace DesignPatterns\Tests\Behavioral\Mediator;
use DesignPatterns\Behavioral\Mediator\Client;
use DesignPatterns\Behavioral\Mediator\Database;
use DesignPatterns\Behavioral\Mediator\Mediator;
use DesignPatterns\Behavioral\Mediator\Server;
use PHPUnit_Framework_TestCase;
class MediatorTest extends PHPUnit_Framework_TestCase
{
public function testOutputHelloWorld()
{
$client = new Client();
new Mediator(new Database(), $client, new Server());
$this->expectOutputString('Hello World');
$client->request();
}
}