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

相关推荐
二哈喇子!31 分钟前
若依【(前后端分离版)SpringBoot+Vue3】
java·spring boot·后端
一只小风华~36 分钟前
JavaScript 函数
开发语言·前端·javascript·ecmascript·web
苕皮蓝牙土豆1 小时前
Qt 分裂布局:QSplitter 使用指南
开发语言·qt
Monkey-旭4 小时前
Android Handler 完全指南
android·java·handler
秃狼4 小时前
Execel文档批量替换标签实现方案
java
Brookty4 小时前
Java线程安全与中断机制详解
java·开发语言·后端·学习·java-ee
Sylvia-girl4 小时前
排序查找算法,Map集合,集合的嵌套,Collections工具类
java·算法·排序算法
TT哇4 小时前
【分治】归并排序——排序数组(medium)
java·算法·排序算法
给力学长4 小时前
自习室预约小程序的设计与实现
java·数据库·vue.js·elementui·小程序·uni-app·node.js
试着4 小时前
零基础学习性能测试第五章:JVM性能分析与调优-JVM概念,java程序运行原理
java·jvm·学习·零基础·性能测试