定義: 外觀模式(Facade):又叫門面模式,為子系統中的一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 代碼實例: 假設實現一個功能需要用到子系統中的四個方法。 /** * Class SubSystemOne */ class SubSystemOn ...
定義:
外觀模式(Facade):又叫門面模式,為子系統中的一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
代碼實例:
假設實現一個功能需要用到子系統中的四個方法。
/** * Class SubSystemOne */ class SubSystemOne { public function methodOne() { return '子系統方法一' . '<br>'; } } /** * Class SubSystemTwo */ class SubSystemTwo { public function methodTwo() { return '子系統方法二' . '<br>'; } } /** * Class SubSystemThree */ class SubSystemThree { public function methodThree() { return '子系統方法三' . '<br>'; } } /** * Class SubSystemFour */ class SubSystemFour { public function methodFour() { return '子系統方法四' . '<br>'; } }
如果不使用外觀模式,客戶端代碼應該為:
$subSystemOne = new SubSystemOne(); $subSystemTwo = new SubSystemTwo(); $subSystemThree = new SubSystemThree(); $subSystemFour = new SubSystemFour(); echo $subSystemOne->methodOne(); echo $subSystemTwo->methodTwo(); echo $subSystemThree->methodThree(); echo $subSystemFour->methodFour();
這樣的寫法需要客戶端瞭解子系統的具體實現方法,且代碼沒有解耦,如果子系統發生變化,則所有的客戶端調用都需要進行相應的變化。
以下使用外觀模式:
新增外觀類Facade.php
/** * 外觀類,整合需要調用的子系統代碼,給客戶端調用,如果子系統發生變化,只用修改外觀類代碼 * Class Facade */ class Facade { /** * @var */ private $subSystemOne; /** * @var */ private $subSystemTwo; /** * @var */ private $subSystemThree; /** * @var */ private $subSystemFour; /** * Facade constructor. */ public function __construct() { $this->subSystemOne = new SubSystemOne(); $this->subSystemTwo = new SubSystemTwo(); $this->subSystemThree = new SubSystemThree(); $this->subSystemFour = new SubSystemFour(); } /** * 整合方法 */ public function method() { echo $this->subSystemOne->methodOne(); echo $this->subSystemTwo->methodTwo(); echo $this->subSystemThree->methodThree(); echo $this->subSystemFour->methodFour(); } }
客戶端調用:
$facade = new Facade(); // 客戶端可以不用知道子系統的存在,調用外觀類中提供的方法就可以 $facade->method();
結果:
子系統方法一
子系統方法二
子系統方法三
子系統方法四
總結:
- 外觀模式能夠為複雜系統提供簡單且清晰的介面。
- 外觀模式只為系統中的某一層或子系統提供單一入口,能夠幫助我們解耦項目中的不同部分,客戶端只需調用一些簡單方法,而不需要瞭解子系統的內部函數。
- 當子系統發生變化時,只會對一個地方產生影響。
- 如果希望客戶端代碼能簡單地調用子系統或系統地改動不會影響客戶端代碼,那麼就可以使用外觀模式。