2.7. Facade (Fachada)¶
2.7.1. Objetivo¶
O principal objetivo de um Facade Pattern não é evitar que você tenha que ler o manual de uma API complexa. É apenas um efeito colateral. O primeiro objetivo é reduzir o acoplamento e seguir a Lei de Demeter.
Uma Facade destina-se a dissociar um cliente e um subsistema, incorporando muitas (porém as vezes apenas uma) interface e, é claro, para reduzir a complexidade.
- Uma Facade não proibe você de acessar o sub-sistema
- Você pode (você deve) ter múltiplas facades para um sub-sistema
É por isso que uma boa facade não tem nenhum new
nela. Se há multiplas criações para cada método, ela não é uma facade, ela é uma Builder (Construtora) ou uma [Abstract|Static|Simple] Factory (Fábrica) [Method].
A melhor facade não tem nenhum new
e um construtor com parâmetros interface-type-hinted. Se você precisa da criação de novas instâncias, use uma Factory (Fábrica) como argumento.
2.7.2. Diagrama UML¶

2.7.3. Código¶
Você também pode encontrar este código no GitHub
Facade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\Facade;
class Facade
{
public function __construct(private Bios $bios, private OperatingSystem $os)
{
}
public function turnOn()
{
$this->bios->execute();
$this->bios->waitForKeyPress();
$this->bios->launch($this->os);
}
public function turnOff()
{
$this->os->halt();
$this->bios->powerDown();
}
}
|
OperatingSystem.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\Facade;
interface OperatingSystem
{
public function halt();
public function getName(): string;
}
|
Bios.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\Facade;
interface Bios
{
public function execute();
public function waitForKeyPress();
public function launch(OperatingSystem $os);
public function powerDown();
}
|
2.7.4. Teste¶
Tests/FacadeTest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php
declare(strict_types=1);
namespace DesignPatterns\Structural\Facade\Tests;
use DesignPatterns\Structural\Facade\Bios;
use DesignPatterns\Structural\Facade\Facade;
use DesignPatterns\Structural\Facade\OperatingSystem;
use PHPUnit\Framework\TestCase;
class FacadeTest extends TestCase
{
public function testComputerOn()
{
$os = $this->createMock(OperatingSystem::class);
$os->method('getName')
->will($this->returnValue('Linux'));
$bios = $this->createMock(Bios::class);
$bios->method('launch')
->with($os);
/** @noinspection PhpParamsInspection */
$facade = new Facade($bios, $os);
$facade->turnOn();
$this->assertSame('Linux', $os->getName());
}
}
|