3.5. 中介者模式
3.5.1. 目的
这种模式提供了一种简单的解耦多组件之间的协同工作方式。如果你有一个“智能中心”,比如控制器(但不是 MVC 的意义上),它是观察者的一个很好的替代品。
所有组件(称为同事)仅与 Mediator 接口耦合,这是一件好事,因为在 OOP 中,一个好朋友胜过多个。这是这种模式的关键特征。
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}