3.5. Посредник
3.5.1. Предназначение
Този модел осигурява лесен начин за отделяне на много компоненти, работещи заедно. Това е добра алтернатива на Observer, АКО имате централен обект, като контролер (но не в смисъла на MVC).
Всички компоненти (наречени колега) са свързани само с интерфейса на Посредника и това е хубаво нещо, защото в ООП един добър приятел е по-добър от много. Това е ключовата характеристика на този шаблон.
3.5.2. UML Диаграма

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}