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种设计模式概览》

相关推荐
名字还没想好☜9 小时前
Go 标准库 flag 包实战:参数解析、子命令、自定义 Value 类型与默认值
开发语言·后端·golang·go
公爵爱学习10 小时前
无人机定点飞行-介绍
开发语言·图像处理·python·学习·线性回归·无人机
西西弗Sisyphus10 小时前
Qt 分类导航区的实现
开发语言·qt
zhanghaha131410 小时前
Python进阶教程:27_subprocess 模块 零基础超详细教程
开发语言·python
兄弟加油,别颓废了。10 小时前
bugku题目
开发语言·前端·python
新知图书10 小时前
3.5 智能体设计模式1:反应式智能体与自动导航案例
人工智能·设计模式·智能体
hfywmsj10 小时前
广州餐饮铺位招租的选址架构:流量入口与成本函数分析
java·大数据·jvm·广州餐饮铺位招租
zh_xuan10 小时前
c++ string_view
开发语言·c++
爪哇岛国人10 小时前
原来我一直理解错了:实现接口真的必须实现所有方法吗?
java
阿里嘎多学长10 小时前
2026-09-05 GitHub 热点项目精选
开发语言·程序员·github·代码托管