目的
門面模式的最初目的并不是為了避免讓你閱讀復雜的 API 檔案,這只是一個附帶作用,其實它的本意是為了降低耦合性并且遵循 Demeter 定律,
Facade通過嵌入多個(當然,有時只有一個)介面來解耦訪客與子系統,同時也為了降低復雜度,
Facade 不會禁止你訪問子系統
你可以(應該)為一個子系統提供多個 Facade
因此一個好的 Facade 里面不會有 new ,如果每個方法里都要構造多個物件,那么它就不是 Facade,而是生成器或者[抽象|靜態|簡單] 工廠 [方法],
優秀的 Facade 不會有 new,并且建構式引數是介面型別的,如果你需要創建一個新實體,則在引數中傳入一個工廠物件,
UML

★官方PHP高級學習交流社群「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨
代碼
- Facade.php
<?php
namespace DesignPatterns\Structural\Facade;
class Facade
{
/**
* @var OsInterface
* 定義作業系統介面變數,
*/
private $os;
/**
* @var BiosInterface
* 定義基礎輸入輸出系統介面變數,
*/
private $bios;
/**
* @param BiosInterface $bios
* @param OsInterface $os
* 傳入基礎輸入輸出系統介面物件 $bios ,
* 傳入作業系統介面物件 $os ,
*/
public function __construct(BiosInterface $bios, OsInterface $os)
{
$this->bios = $bios;
$this->os = $os;
}
/**
* 構建基礎輸入輸出系統執行啟動方法,
*/
public function turnOn()
{
$this->bios->execute();
$this->bios->waitForKeyPress();
$this->bios->launch($this->os);
}
/**
* 構建系統關閉方法,
*/
public function turnOff()
{
$this->os->halt();
$this->bios->powerDown();
}
}
- OsInterface.php
<?php
namespace DesignPatterns\Structural\Facade;
/**
* 創建作業系統介面類 OsInterface ,
*/
interface OsInterface
{
/**
* 宣告關機方法,
*/
public function halt();
/**
* 宣告獲取名稱方法,回傳字串格式資料,
*/
public function getName(): string;
}
- BiosInterface.php
<?php
namespace DesignPatterns\Structural\Facade;
/**
* 創建基礎輸入輸出系統介面類 BiosInterface ,
*/
interface BiosInterface
{
/**
* 宣告執行方法,
*/
public function execute();
/**
* 宣告等待密碼輸入方法
*/
public function waitForKeyPress();
/**
* 宣告登錄方法,
*/
public function launch(OsInterface $os);
/**
* 宣告關機方法,
*/
public function powerDown();
}
測驗
- Tests/FacadeTest.php
<?php
namespace DesignPatterns\Structural\Facade\Tests;
use DesignPatterns\Structural\Facade\Facade;
use DesignPatterns\Structural\Facade\OsInterface;
use PHPUnit\Framework\TestCase;
/**
* 創建自動化測驗單元 FacadeTest ,
*/
class FacadeTest extends TestCase
{
public function testComputerOn()
{
/** @var OsInterface|\PHPUnit_Framework_MockObject_MockObject $os */
$os = $this->createMock('DesignPatterns\Structural\Facade\OsInterface');
$os->method('getName')
->will($this->returnValue('Linux'));
$bios = $this->getMockBuilder('DesignPatterns\Structural\Facade\BiosInterface')
->setMethods(['launch', 'execute', 'waitForKeyPress'])
->disableAutoload()
->getMock();
$bios->expects($this->once())
->method('launch')
->with($os);
$facade = new Facade($bios, $os);
// 門面介面很簡單,
$facade->turnOn();
// 但你也可以訪問底層組件,
$this->assertEquals('Linux', $os->getName());
}
}
PHP 互聯網架構師成長之路*「設計模式」終極指南
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,識訓9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術咨詢和指導,歡迎加入我們的群啊,暗號:phpzh(君羊號碼856460874),
2020年最新PHP進階教程,全系列!

內容不錯的話希望大家支持鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什么問題 建議 想看的內容可以在評論提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/66098.html
標籤:其他
上一篇:初識Hadoop之概念認知篇
