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

相关推荐
sg_knight1 小时前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
_何同学1 小时前
Ollama 安装 DeepSeek 与 Spring Boot 集成指南
java·spring boot·后端·ai
虾球xz3 小时前
CppCon 2016 学习:GAME ENGINE USING C++11
大数据·开发语言·c++·学习
Jet45053 小时前
第100+42步 ChatGPT学习:R语言实现阈值调整
开发语言·学习·chatgpt·r语言
虾球xz3 小时前
CppCon 2016 学习:fixed_point Library
开发语言·c++·学习
希希不嘻嘻~傻希希3 小时前
CSS 字体与文本样式笔记
开发语言·前端·javascript·css·ecmascript
Code季风3 小时前
跨语言RPC:使用Java客户端调用Go服务端的HTTP-RPC服务
java·网络协议·http·rpc·golang
盖世英雄酱581363 小时前
时间设置的是23点59分59秒,数据库却存的是第二天00:00:00
java·数据库·后端
寄思~4 小时前
Python学习笔记:错误和异常处理
开发语言·笔记·python·学习
clmm1234 小时前
Java动态生成Nginx服务配置
java·开发语言·nginx