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