3.5. Посредник

3.5.1. Предназначение

Този модел осигурява лесен начин за отделяне на много компоненти, работещи заедно. Това е добра алтернатива на Observer, АКО имате централен обект, като контролер (но не в смисъла на MVC).

Всички компоненти (наречени колега) са свързани само с интерфейса на Посредника и това е хубаво нещо, защото в ООП един добър приятел е по-добър от много. Това е ключовата характеристика на този шаблон.

3.5.2. UML Диаграма

Alt Mediator UML Diagram

3.5.3. Код

Можете също да намерите този код в GitHub

Mediator.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Behavioral\Mediator;
 6
 7interface Mediator
 8{
 9    public function getUser(string $username): string;
10}

Colleague.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Behavioral\Mediator;
 6
 7abstract class Colleague
 8{
 9    protected Mediator $mediator;
10
11    final public function setMediator(Mediator $mediator)
12    {
13        $this->mediator = $mediator;
14    }
15}

Ui.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Behavioral\Mediator;
 6
 7class Ui extends Colleague
 8{
 9    public function outputUserInfo(string $username)
10    {
11        echo $this->mediator->getUser($username);
12    }
13}

UserRepository.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Behavioral\Mediator;
 6
 7class UserRepository extends Colleague
 8{
 9    public function getUserName(string $user): string
10    {
11        return 'User: ' . $user;
12    }
13}

UserRepositoryUiMediator.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Behavioral\Mediator;
 6
 7class UserRepositoryUiMediator implements Mediator
 8{
 9    public function __construct(private UserRepository $userRepository, private Ui $ui)
10    {
11        $this->userRepository->setMediator($this);
12        $this->ui->setMediator($this);
13    }
14
15    public function printInfoAbout(string $user)
16    {
17        $this->ui->outputUserInfo($user);
18    }
19
20    public function getUser(string $username): string
21    {
22        return $this->userRepository->getUserName($username);
23    }
24}

3.5.4. Тест

Tests/MediatorTest.php

 1<?php
 2
 3declare(strict_types=1);
 4
 5namespace DesignPatterns\Tests\Mediator\Tests;
 6
 7use DesignPatterns\Behavioral\Mediator\Ui;
 8use DesignPatterns\Behavioral\Mediator\UserRepository;
 9use DesignPatterns\Behavioral\Mediator\UserRepositoryUiMediator;
10use PHPUnit\Framework\TestCase;
11
12class MediatorTest extends TestCase
13{
14    public function testOutputHelloWorld()
15    {
16        $mediator = new UserRepositoryUiMediator(new UserRepository(), new Ui());
17
18        $this->expectOutputString('User: Dominik');
19        $mediator->printInfoAbout('Dominik');
20    }
21}