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

相关推荐
铲子Zzz27 分钟前
Java使用接口AES进行加密+微信小程序接收解密
java·开发语言·微信小程序
霖檬ing32 分钟前
K8s——配置管理(1)
java·贪心算法·kubernetes
小小小新人121231 小时前
C语言 ATM (4)
c语言·开发语言·算法
Two_brushes.1 小时前
【linux网络】网络编程全流程详解:从套接字基础到 UDP/TCP 通信实战
linux·开发语言·网络·tcp/udp
小白学大数据1 小时前
R语言爬虫实战:如何爬取分页链接并批量保存
开发语言·爬虫·信息可视化·r语言
争不过朝夕,又念着往昔1 小时前
Go语言反射机制详解
开发语言·后端·golang
Azxcc01 小时前
C++异步编程入门
开发语言·c++
Vic101011 小时前
Java 开发笔记:多线程查询逻辑的抽象与优化
java·服务器·笔记
Biaobiaone1 小时前
Java中的生产消费模型解析
java·开发语言
我命由我123452 小时前
前端开发问题:SyntaxError: “undefined“ is not valid JSON
开发语言·前端·javascript·vue.js·json·ecmascript·js