PHP 设计模式 - 结构型 - 门面模式(Facade)
2021-01-18 本文已影响0人
SylviaYuan95
1. 模式定义
门面模式(Facade)又称外观模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。引入门面角色之后,用户只需要直接与门面角色交互,用户与子系统之间的复杂关系由门面角色来实现,从而降低了系统的耦合度。
门面模式对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便;实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户;如果应用需要,门面模式并不限制客户程序使用子系统类,因此你可以让客户程序在系统易用性和通用性之间加以选择。 Laravel 中门面模式的使用也很广泛,基本上每个服务容器中注册的服务提供者类都对应一个门面类。
2. UML类图
image.png3. 示例代码
BiosInterface.php
<?php
namespace DesignPattern\Structural\Facade;
/**
* BIOS "Basic Input Output System"的缩略词,基本输入输出系统
* Interface BiosInterface
* @package DesignPattern\Structural\Facade
*/
interface BiosInterface
{
/**
* 执行BIOS
*/
public function execute();
/**
* 等待停止
*/
public function waitForKeyPress();
/**
* 启动操作系统
*
* @param OsInterface $os
*/
public function launch(OsInterface $os);
/**
* 关闭BIOS
*/
public function powerDown();
}
OsInterface.php
<?php
namespace DesignPattern\Structural\Facade;
/**
* 操作系统
*/
interface OsInterface
{
/**
* 停止操作系统
*/
public function halt();
}
Bios.php
BiosInterface接口的实现类
<?php
namespace DesignPattern\Structural\Facade;
/**
* BIOS "Basic Input Output System"的缩略词,基本输入输出系统
* Interface BiosInterface
* @package DesignPattern\Structural\Facade
*/
class Bios implements BiosInterface
{
/**
* 执行BIOS
*/
public function execute()
{
}
/**
* 等待停止
*/
public function waitForKeyPress()
{
}
/**
* 启动操作系统
*
* @param OsInterface $os
*/
public function launch(OsInterface $os)
{
}
/**
* 关闭BIOS
*/
public function powerDown()
{
}
}
Linux.php
OsInterface接口的实现类
<?php
namespace DesignPattern\Structural\Facade;
/**
* 操作系统
*/
class Linux implements OsInterface
{
/**
* 停止操作系统
*/
public function halt()
{
}
public function getName()
{
return 'Linux';
}
}
Facade 门面类
直接跟用户进行交互,通过接口隐藏子系统组件。
<?php
namespace DesignPattern\Structural\Facade;
/**
* 门面类
*/
class Facade
{
/**
* @var OsInterface
*/
protected $os;
/**
* @var BiosInterface
*/
protected $bios;
/**
* 使用依赖注入容器创建此类的实例
*
* @param BiosInterface $bios
* @param OsInterface $os
*/
public function __construct(BiosInterface $bios, OsInterface $os)
{
$this->bios = $bios;
$this->os = $os;
}
/**
* turn on the system
*/
public function turnOn()
{
$this->bios->execute();
$this->bios->waitForKeyPress();
$this->bios->launch($this->os);
}
/**
* turn off the system
*/
public function turnOff()
{
$this->os->halt();
$this->bios->powerDown();
}
}
单元测试
<?php
namespace DesignPattern\Tests;
use DesignPattern\Structural\Facade\Bios;
use DesignPattern\Structural\Facade\Facade as Computer;
use DesignPattern\Structural\Facade\Linux;
use PHPUnit\Framework\TestCase;
/**
* FacadeTest用于测试门面模式
*/
class FacadeTest extends TestCase
{
public function testComputerOn()
{
//注册门面
$bios = new Bios();
$os = new Linux();
$facade = new Computer($bios, $os);
// 用户直接使用门面,界面简单;对客户屏蔽子系统组件
$facade->turnOn();
// 且用户也可以访问较低的组件
$this->assertEquals('Linux', $os->getName());
}
}
参考文档:https://laravelacademy.org/post/2807
教程源码:https://github.com/SylviaYuan1995/DesignPatternDemo