目录
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、适用场景
复杂子系统整合:为遗留系统或第三方库提供简洁接口。
分层架构设计:每层通过门面对外暴露功能。
简化常用流程:如订单支付、用户注册等涉及多步骤的操作。