Java编程之外观模式

前言

想象你要去一家很复杂的餐厅吃饭,但不想自己点菜、排队、找位置,也不想管厨房、洗碗、送餐这些后端流程。你只需要告诉餐厅服务员"我要一份牛排套餐",然后坐等就好。这个服务员,就是外观模式(Facade Pattern)

模式定义

外观模式(Facade Pattern)是一种结构型设计模式,其核心目标是为复杂子系统提供一个统一的高层接口,简化客户端与系统的交互。它通过封装子系统的复杂逻辑,隐藏底层细节,使客户端无需了解子系统内部实现即可完成操作。这种模式符合迪米特法则(最少知识原则),有效降低了系统耦合度。

核心思路

外观模式就是给一大堆复杂系统(子系统)加一个"门面"/"服务员":

  • 客户端只跟这个门面打交道,只需一句话完成任务;
  • 门面负责协调各个子系统(菜品准备、厨房、收银、送餐等)完成请求;
  • 客户端无需知道内部复杂流程,只关注结果。
scss 复制代码
    ┌─────────┐
    │ Client  │
    │─────────│
    │meal()   │
    └─────────┘
         │
         │ calls
         ▼
   ┌───────────────────────┐
   │ RestaurantFacade      │ ◀───┐
   │──────────────────────│     │   门面角色,隐藏内部流程
   │ + orderMeal(): void   │     │
   └───────────────────────┘     │
         │     │     │           │
         │     │     │ coordinates
         │     │     ▼
         │     │ ┌───────────────┐
         │     │ │ Kitchen       │  子系统 A:做菜
         │     │ │ + cookFood()  │
         │     │ └───────────────┘
         │     ▼
         │ ┌───────────────┐
         │ │ Cashier       │  子系统 B:收银
         │ │ + takePayment()│
         │ └───────────────┘
         ▼
   ┌───────────────┐
   │ WaiterDelivery│  子系统 C:送餐
   │ + deliver()   │
   └───────────────┘

就像你打电话叫外卖,不用自己跑去不同店铺、找骑手、付钱、还要问"什么时候送到"......

你只需要叫一个号码(比如美团/饿了么),对方帮你搞定全部流程。

代码示例

以家庭智能控制为例子来说明,灯光,空调,音响智能设备的开启为例子如下:

java 复制代码
// 子系统 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种设计模式概览》

相关推荐
似水明俊德1 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Leinwin1 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
薛定谔的悦1 小时前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士2 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
Thera7772 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
罗超驿2 小时前
独立实现双向链表_LinkedList
java·数据结构·链表·linkedlist
炘爚3 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon3 小时前
C#常用类库-详解SerialPort
开发语言·c#
盐水冰3 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
凸头3 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言