Посередник (англ. 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 ();
}
}