門面模式的最初目的並非爲了不讓你閱讀複雜的 API 文檔,這只是一個附帶做用。其實它的本意是爲了下降耦合性而且遵循 Demeter 定律。php
Facade經過嵌入多個(固然,有時只有一個)接口來解耦訪客與子系統,同時也爲了下降複雜度。ios
Facade 不會禁止你訪問子系統laravel
你能夠(應該)爲一個子系統提供多個 Facade面試
所以一個好的 Facade 裏面不會有 new 。若是每一個方法裏都要構造多個對象,那麼它就不是 Facade,而是生成器或者[抽象|靜態|簡單] 工廠 [方法]。sql
優秀的 Facade 不會有 new,而且構造函數參數是接口類型的。若是你須要建立一個新實例,則在參數中傳入一個工廠對象。shell
<?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(); } }
<?php namespace DesignPatterns\Structural\Facade; /** * 建立操做系統接口類 OsInterface 。 */ interface OsInterface { /** * 聲明關機方法。 */ public function halt(); /** * 聲明獲取名稱方法,返回字符串格式數據。 */ public function getName(): string; }
<?php namespace DesignPatterns\Structural\Facade; /** * 建立基礎輸入輸出系統接口類 BiosInterface 。 */ interface BiosInterface { /** * 聲明執行方法。 */ public function execute(); /** * 聲明等待密碼輸入方法 */ public function waitForKeyPress(); /** * 聲明登陸方法。 */ public function launch(OsInterface $os); /** * 聲明關機方法。 */ public function powerDown(); }
<?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 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)架構
面試10家公司,收穫9個offer,2020年PHP 面試問題併發
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出