天津网站建设优选企业,怎么创建企业网站,wordpress左右滑动插件,广州市公司网站建设公司前言
想象你要去一家很复杂的餐厅吃饭#xff0c;但不想自己点菜、排队、找位置#xff0c;也不想管厨房、洗碗、送餐这些后端流程。你只需要告诉餐厅服务员“我要一份牛排套餐”#xff0c;然后坐等就好。这个服务员#xff0c;就是外观模式#xff08;Facade Pattern但不想自己点菜、排队、找位置也不想管厨房、洗碗、送餐这些后端流程。你只需要告诉餐厅服务员“我要一份牛排套餐”然后坐等就好。这个服务员就是外观模式Facade Pattern
模式定义
外观模式Facade Pattern是一种结构型设计模式其核心目标是为复杂子系统提供一个统一的高层接口简化客户端与系统的交互。它通过封装子系统的复杂逻辑隐藏底层细节使客户端无需了解子系统内部实现即可完成操作。这种模式符合迪米特法则最少知识原则有效降低了系统耦合度。
核心思路
外观模式就是给一大堆复杂系统子系统加一个“门面”/“服务员”
客户端只跟这个门面打交道只需一句话完成任务门面负责协调各个子系统菜品准备、厨房、收银、送餐等完成请求客户端无需知道内部复杂流程只关注结果。 ┌─────────┐│ Client ││─────────││meal() │└─────────┘││ calls▼┌───────────────────────┐│ RestaurantFacade │ ◀───┐│──────────────────────│ │ 门面角色隐藏内部流程│ orderMeal(): void │ │└───────────────────────┘ ││ │ │ ││ │ │ coordinates│ │ ▼│ │ ┌───────────────┐│ │ │ Kitchen │ 子系统 A做菜│ │ │ cookFood() ││ │ └───────────────┘│ ▼│ ┌───────────────┐│ │ Cashier │ 子系统 B收银│ │ takePayment()││ └───────────────┘▼┌───────────────┐│ WaiterDelivery│ 子系统 C送餐│ deliver() │└───────────────┘
就像你打电话叫外卖不用自己跑去不同店铺、找骑手、付钱、还要问“什么时候送到”…… 你只需要叫一个号码比如美团/饿了么对方帮你搞定全部流程。 代码示例
以家庭智能控制为例子来说明灯光空调音响智能设备的开启为例子如下
// 子系统 A
//灯光
class Light { void on() { System.out.println(Lights ON); }
}
//空调
class AC{ void setTemp(int t) { System.out.println(AC set to t); }
}
//音响
class Music { void play() { System.out.println(Music playing); }
}// 外观类
class SmartHomeFacade {private Light light new Light();private AC ac new AC();private Music music new Music();public void startEvening() {light.on();ac.setTemp(22);music.play();}
}// 客户端
SmartHomeFacade home new SmartHomeFacade();
home.startEvening();
// 输出Lights ON
// AC set to 22
// Music playing客户端不用管 Light、AC、Music 怎么协作只调用 startEvening() 一句话搞定所有流程。
特点总结
优点解释1. 使用简单客户只关注一两个调用不需要学习复杂系统2. 隐藏内部细节子系统内部发生什么客户端完全不关心3. 解耦子系统可以独立变化不影响客户端4. 有统一入口便于控制、安全、维护
使用场景
当系统复杂涉及多个子模块但客户端只需一部分功能当你想隔离外部代码对内部的依赖便于将来变动时更灵活当你想给外部提供简易、安全、统一的入口。
小结
外观模式就是帮助你写一个“智能接待员”——让系统对外更友好同时把复杂逻辑藏在后台。就像用遥控器控制电视不用自己打线路、管芯片。业务简单了代码也更清晰、更易扩展。是不是很简单你看懂了么
参考
《23种设计模式概览》