Посредник (Mediator)

Посредник — это поведенческий паттерн, который упрощает коммуникацию между компонентами системы.

Посредник убирает прямые связи между отдельными компонентами, заставляя их общаться друг с другом через себя.

Особенности паттерна на PHP

Применимость: Посредник не столь актуален в PHP, как в других языках, из-за того, что разные компоненты приложения не часто общаются друг с другом в пределах одной сессии скрипта.

Тем не менее, примерами паттерна могут служить EventDispatcher-ы многих фреймворков, а также некоторые реализации контроллеров в MVC фреймворках.


Пример структуры паттерна

<?php
 
/**
 * Интерфейс Посредника предоставляет методы, используемый компонентами для
 * для вывода страницы
 */
interface IHelper
{
    public function sendResponse($content);
    public function getRequest();
    public function getData();
 
}
 
/**
 * Конкретные Посредники реализуют совместное поведение, координируя отдельные
 * компоненты.
 */
class PageHelper implements IHelper 
{
    public $data;
    public $page;
    public $router;
 
    public function __construct($data, $router, $page) {
        $this->data = $data;
        $this->page = $page;
        $this->router = $router;
 
        $this->data->setPageHelper($this);
        $this->page->setPageHelper($this);
        $this->router->setPageHelper($this);
 
    }
 
    public function sendResponse($content) {
        $this->router->output($content);
    }
    public function getRequest() {
        $this->page->render();
    }
    public function getData() {
        return $this->data->getData();
    }
}
 
 
/**
 * Базовый Компонент обеспечивает базовую функциональность хранения экземпляра
 * посредника внутри объектов компонентов.
 */
abstract class App 
{
    protected $pageHelper;
 
    public function setPageHelper(IHelper $pageHelper) {
        $this->pageHelper = $pageHelper;
    }
}
 
class Page extends App 
{
    public function render() {
        $data = $this->pageHelper->getData();
        $this->pageHelper->sendResponse("Page render with data ". $data);
    }
}
 
 
class Data extends App 
{
    public function getData() 
    {
        return 'some data';
    }
}
 
 
class Router extends App 
{
    public function request() {
        $this->pageHelper->getRequest();
    }
 
    public function output(string $content) {
        echo $content;
    }
}
 
$router = new Router();
new PageHelper(new Data(), $router, new Page());
 
$router->request();

Результат выполнения

Page render with data some data