目錄
1、核心思想
2、實現方式
2.1 模式結構
2.2 實現案例
3、優缺點分析
4、適用場景
1、核心思想
目的:通過高層接口(門面類)封裝多個子系統的復雜交互,客戶端只需與門面交互,簡化入口;同時隔離客戶端與子系統,子系統的修改不影響客戶端代碼,實現解耦。
舉例:
1>?早期的相機使用起來是非常麻煩的,拍照前總是要根據場景情況進行一系列復雜的操作,如對焦、調節閃光燈、調光圈等,非專業人士面對這么一大堆的操作按鈕根本無從下手,拍出來的照片質量也不高。隨著科技發展,出現“傻瓜相機”,用戶再也不必學習那些復雜的參數調節了,只要按下快門鍵就可完成所有操作。
2>?自動擋汽車對離合及換擋操作的封裝
3>?全自動洗衣機對浸泡、漂洗、甩干、排水等一系列操作的封裝
2、實現方式
2.1 模式結構
- Facade(外觀門面)?:封裝了多個子系統,并將它們整合起來對外提供統一的訪問接口。
- SubSystemA、SubSystemB、SubSystemC(子系統A、子系統B、子系統C)?:隱藏于門面中的子系統,數量任意,且對外部不可見,可直接調用或者通過門面調用。
2.2 實現案例
假設一個智能家居包含燈光、空調、音響等設備,啟動“觀影模式”需依次執行以下操作:關燈、開空調并調至26℃、開音響并切換到電影模式。
// 子系統
class Light { void off() { /* 關燈 */ } }
class AirConditioner { void on(int temp) { /* 開空調 */ } }
class SoundSystem { void movieMode() { /* 音響電影模式 */ } }// 門面類
class HomeTheaterFacade {private Light light;private AirConditioner ac;private SoundSystem sound;public HomeTheaterFacade() {light = new Light();ac = new AirConditioner();sound = new SoundSystem();}public void startMovie() {light.off();ac.on(26);sound.movieMode();}
}// 客戶端調用
public class Client {public static void main(String[] args) {HomeTheaterFacade facade = new HomeTheaterFacade();facade.startMovie(); // 一鍵啟動觀影模式}
}
3、優缺點分析
優點:
簡化客戶端使用:隱藏復雜性,提供清晰接口。
降低耦合:客戶端僅依賴門面,子系統變化時只需調整門面。
提高靈活性:可自由替換或擴展子系統,不影響客戶端。
缺點:
過度集中風險:若門面類過于龐大,可能成為“上帝對象”。
靈活性受限:若需要定制化操作,仍需繞過門面直接調用子系統。
4、適用場景
-
復雜子系統整合:為遺留系統或第三方庫提供簡潔接口。
-
分層架構設計:每層通過門面對外暴露功能。
-
簡化常用流程:如訂單支付、用戶注冊等涉及多步驟的操作。