2.7. Фасада
2.7.1. Предназначение
Основната цел на фасаден шаблон не е да не ви се налага да четете ръководството на сложен API. Това е само страничен ефект. Първата цел е да се намали връзката и да се следва закона на Деметра (Law of Demeter).
Фасадата има за цел да отдели клиент и подсистема чрез вграждане на много (но понякога само един) интерфейс и, разбира се, да намали сложността.
Фасадата не ви забранява достъпа до подсистемата
Можете (трябва) да имате множество фасади за една подсистема
Ето защо добрата фасада няма new
в себе си. Ако има множество творения за всеки метод, това не е Facade, това е Builder или [Abstract|Static|Simple] Factory [Method].
Най-добрата фасада няма new
и конструктор с interface-type-hinted параметри. Ако се нуждаете от създаване на нови копия, използвайте Factory като аргумент.
2.7.2. UML Диаграма

2.7.3. Код
Можете също да намерите този код в GitHub
Facade.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\Facade;
6
7class Facade
8{
9 public function __construct(private Bios $bios, private OperatingSystem $os)
10 {
11 }
12
13 public function turnOn()
14 {
15 $this->bios->execute();
16 $this->bios->waitForKeyPress();
17 $this->bios->launch($this->os);
18 }
19
20 public function turnOff()
21 {
22 $this->os->halt();
23 $this->bios->powerDown();
24 }
25}
OperatingSystem.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\Facade;
6
7interface OperatingSystem
8{
9 public function halt();
10
11 public function getName(): string;
12}
Bios.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\Facade;
6
7interface Bios
8{
9 public function execute();
10
11 public function waitForKeyPress();
12
13 public function launch(OperatingSystem $os);
14
15 public function powerDown();
16}
2.7.4. Тест
Tests/FacadeTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace DesignPatterns\Structural\Facade\Tests;
6
7use DesignPatterns\Structural\Facade\Bios;
8use DesignPatterns\Structural\Facade\Facade;
9use DesignPatterns\Structural\Facade\OperatingSystem;
10use PHPUnit\Framework\TestCase;
11
12class FacadeTest extends TestCase
13{
14 public function testComputerOn()
15 {
16 $os = $this->createMock(OperatingSystem::class);
17
18 $os->method('getName')
19 ->will($this->returnValue('Linux'));
20
21 $bios = $this->createMock(Bios::class);
22
23 $bios->method('launch')
24 ->with($os);
25
26 /** @noinspection PhpParamsInspection */
27 $facade = new Facade($bios, $os);
28 $facade->turnOn();
29
30 $this->assertSame('Linux', $os->getName());
31 }
32}