门面模式也叫外观模式,主要是为子系统中的一组接口提供一个一致的接口,facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

一个简单的🌰:

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Facade
{

private Subsystem $subsystemA;
private Subsystem $subsystemB;

public function __construct(Subsystem $subsystemA, Subsystem $subsystemB)
{
$this->subsystemA = $subsystemA;
$this->subsystemB = $subsystemB;
}

public function subsystemARun()
{
$this->subsystemA->run();
}

public function subsystemBRun()
{
$this->subsystemB->run();
}
}


interface Subsystem
{
public function run();
}

class SubsystemA implements Subsystem
{
public function run()
{
echo '子系统 A 运行', PHP_EOL;
}
}


class SubsystemB implements Subsystem
{
public function run()
{
echo '子系统 B 运行', PHP_EOL;
}
}

$subsystemA = new SubsystemA();
$subsystemB = new SubsystemB();
$facade = new Facade($subsystemA, $subsystemB);
$facade->subsystemARun();
$facade->subsystemBRun();

当需要为一个复杂子系统提供一个简单的接口时,门面模式非常适用。同时当需要构建一个层次结构的子系统时,门面模式也可以充当每层子系统的入口点,例如 MVC 框架。

这个模式跟在 laravel 框架中看的的还有所不同,在框架中,调用门面时,会通过魔术方法去调用背后真正的功能类方法,而且每个门面只负责一个独立的模块。相对来说,框架中的用法更符合单一职责。