聲明:本系列博客參考資料《大話設計模式》,作者程傑。
門面模式(有時候也稱外觀模式)是指提供一個統一的接口去訪問多個子系統的多個不同的接口,它為子系統中的一組接口提供一個統一的高層接口。使用子系統更容易使用。
案例:炒股票,新股民不了解證券知識做股票,是很容易虧錢的,需要學習的知識太多了,這樣新手最好把炒股的事情委托給基金公司,基金公司了解證券知識,那麼新股民把自己的股票托管給基金公司去運營,這樣新股民不必了解哪只股票的走勢就可以完成股票的買賣。基金公司在這裡就是一個門面,針對於新股民的門面。
UML類圖:
角色分析:
門面(FacadeCompany)角色:此角色封裝一個高層接口,將客戶端的請求代理給適當的子系統對象,是門面模式的核心接口。
子系統(ICBC)角色:實現子系統的具體功能,處理FacadeCompany對象指派的任務。子系統沒有FacadeCompany的任何信息,沒有對FacadeCompany對象的引用。
具體代碼案例:
; } function sell() { echo 賣出阿裡股票 ; } } /**萬達股票 * Class Wanda */ class Wanda { function buy() { echo 買入萬達股票 ; } function sell() { echo 賣出萬達股票 ; } } /**京東股票 * Class Jingdong */ class Jingdong { function buy() { echo 買入京東股票 ; } function sell() { echo 賣出京東股票 ; } } /**門面模式核心角色 * Class FacadeCompany */ class FacadeCompany { private $ali; private $wanda; private $jingdong; function __construct() { $this->ali=new Ali(); $this->jingdong=new Jingdong(); $this->wanda=new Wanda(); } function buy() { $this->wanda->buy(); $this->ali->buy(); } function sell() { $this->jingdong->sell(); } }
header(Content-Type:text/html;charset=utf-8); //------------------------門面模式測試代碼------------------ require_once ./Facade/Facade.php; $lurenA=new FacadeCompany(); $lurenA->buy(); $lurenA->sell();
1)它可以對客戶屏蔽子系統組件,因而減少了客戶處理的對象的數目並使得子系統使用起來更加方便。
2) 它實現了子系統與客戶之間的松耦合關系,而子系統內部的功能組件往往是緊耦合的。松耦合關系使得子系統的組件變化不會影響到它的客戶。 Facade模式有助於建立層次結構系統,也有助於對對象之間的依賴關系分層。
3) Facade模式可以消除復雜的循環依賴關系。這一點在客戶程序與子系統是分別實現的時候尤為重要。在大型軟件系統中降低編譯依賴性至關重要。在子系統類改變時,希望盡量減少重編譯工作以節省時間。用Facade可以降低編譯依賴性,限制重要系統中較小的變化所需的重編譯工作。
4)Facade模式同樣也有利於簡化系統在不同平台之間的移植過程,因為編譯一個子系統一般不需要編譯所有其他的子系統。