当前位置: 首页 > news >正文

设计模式---门面模式

设计模式——门面模式

一、什么是门面模式?

门面模式(Facade Pattern)是一种结构型设计模式,它的核心思想是:为复杂的子系统提供一个统一的入口

你可以把它理解为“前台”或者“客服”。

  • 在公司里,客户不会直接去找财务、技术、仓库,而是先联系前台或者客服。
  • 前台(门面类)接收请求,然后在内部协调各个部门(子系统类),最后给客户一个结果。

这样一来,客户只需要面对“一个接口”,而不用了解背后复杂的流程。


二、为什么需要门面模式?

假设我们在做一个家庭影院系统,它有很多设备:

  • DVD 播放器
  • 投影仪
  • 音响
  • 灯光

如果客户想看一场电影,需要按顺序做很多操作:

  1. 打开灯光并调暗
  2. 打开投影仪并调成宽屏模式
  3. 打开音响并设置音量
  4. 打开 DVD 并播放电影

当电影结束,还需要按顺序关闭所有设备。

如果让客户端自己调用这些子系统的接口,会非常繁琐,也容易出错。
这时,我们就可以用门面模式,封装一套“简化操作”的接口:

  • watchMovie():一键开始电影
  • endMovie():一键关闭影院

这样,客户端只需要调用两行代码,背后复杂的流程全部由门面类完成。


三、代码示例(Java 实现)

1. 子系统类

// DVD 播放器
class DVDPlayer {public void on() { System.out.println("DVD 打开"); }public void play(String movie) { System.out.println("播放电影: " + movie); }public void off() { System.out.println("DVD 关闭"); }
}// 投影仪
class Projector {public void on() { System.out.println("投影仪 打开"); }public void wideScreenMode() { System.out.println("投影仪设置为宽屏模式"); }public void off() { System.out.println("投影仪 关闭"); }
}// 音响
class SoundSystem {public void on() { System.out.println("音响 打开"); }public void setVolume(int level) { System.out.println("音量设置为: " + level); }public void off() { System.out.println("音响 关闭"); }
}// 灯光
class Light {public void dim(int level) { System.out.println("灯光调暗到: " + level + "%"); }public void on() { System.out.println("灯光恢复正常亮度"); }
}

2. 门面类(统一入口)

class HomeTheaterFacade {private DVDPlayer dvd;private Projector projector;private SoundSystem sound;private Light light;public HomeTheaterFacade(DVDPlayer dvd, Projector projector, SoundSystem sound, Light light) {this.dvd = dvd;this.projector = projector;this.sound = sound;this.light = light;}// 一键启动影院public void watchMovie(String movie) {System.out.println("准备开始看电影...");light.dim(10);projector.on();projector.wideScreenMode();sound.on();sound.setVolume(20);dvd.on();dvd.play(movie);}// 一键关闭影院public void endMovie() {System.out.println("关闭影院...");dvd.off();sound.off();projector.off();light.on();}
}

3. 客户端调用

public class FacadeDemo {public static void main(String[] args) {// 创建子系统对象DVDPlayer dvd = new DVDPlayer();Projector projector = new Projector();SoundSystem sound = new SoundSystem();Light light = new Light();// 创建门面对象HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvd, projector, sound, light);// 客户端只需要两行代码homeTheater.watchMovie("《731电影》");homeTheater.endMovie();}
}

4. 运行结果

准备开始看电影...
灯光调暗到: 10%
投影仪 打开
投影仪设置为宽屏模式
音响 打开
音量设置为: 20
DVD 打开
播放电影: 《731电影》
关闭影院...
DVD 关闭
音响 关闭
投影仪 关闭
灯光恢复正常亮度

四、门面模式的优缺点

优点

  1. 简化调用:客户端不用了解复杂的子系统,只需要面对一个统一的接口。
  2. 解耦:降低了客户端与子系统之间的依赖。
  3. 易维护:修改子系统时,只要保持门面接口不变,客户端就不受影响。

缺点

  1. 复杂:如果门面类功能越来越多,会变得臃肿。
  2. 不够灵活:有些特殊需求,可能还需要绕过门面直接操作子系统。

五、应用场景

  1. 复杂系统提供简化接口:比如数据库访问,Spring 提供了 JdbcTemplate,只要写几行代码就能执行 SQL,而不用自己写 JDBC 的连接、关闭等繁琐逻辑。
  2. 一键操作:如电脑的“电源键”,背后其实涉及 CPU、内存、风扇、操作系统启动等复杂过程。
  3. 统一入口:像银行柜台、公司前台,都是门面模式的典型应用。

六、总结

门面模式的精髓是:
在复杂系统和客户端之间,提供一个简单的入口,让客户端更轻松地使用系统。

在实际开发中,我们经常会遇到系统复杂、调用繁琐的情况。此时,如果能为它们设计一个“门面类”,不仅能让客户端更好用,还能降低耦合,提升系统的可维护性。

一句话总结:
门面模式就是帮客户节省时间的“客服”,而不是让客户自己在后厨乱找。

http://www.dtcms.com/a/393816.html

相关文章:

  • SQL Server从入门到项目实践(超值版)读书笔记 26
  • Datawhale学习笔记——深度语义匹配模型DSSM详解、实战与FAQ
  • 一文了解瑞萨MCU常用的芯片封装类型
  • LeetCode:44.二叉搜索树中第K小的元素
  • 初学者如何系统性地学习Linux?
  • LeetCode:43.验证二叉搜索树
  • [学习log] OT/ICS工业控制系统渗透测试
  • 六边形箱图 (Hexbin Plot):使用 Matplotlib 处理大规模散点数据
  • LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(2——Parser解析html模块)
  • 电脑能ping开发板,开发板不能ping电脑的解决方法:
  • git 覆盖:检出特定分支的文件到当前分支
  • CentOS 8.5.2.111部署Zabbix6.0
  • 【Elasticsearch面试精讲 Day 20】集群监控与性能评估
  • hive调优系列-3.HQL语法和运行参数层面
  • 计算机网络学习(三、数据链路层)
  • Refresh keys changed: [] 2023.0.3.3 问题排查
  • 高并发内存池(二):三层缓存的整体框架设计
  • Android音视频编解码全流程之Extractor
  • 基于 @antv/x6 实现流程图
  • markdown 绘制流程图
  • Spark专题-第二部分:Spark SQL 入门(5)-算子介绍-Join
  • 平替Jira,推荐一款国产开源免费的项目管理工具-Kanass
  • ssh不用版本管理器为多个服务器添加密钥
  • Windows Docker Desktop 实战:大模型存入 docker-desktop 实例 home 目录并与 Dify 联动运行指南
  • linux驱动开发笔记
  • 阿里云与腾讯云产品操作与体验:云平台运维实战技术解析
  • 深入了解linux网络—— 网络基础
  • leetcode3 哈希
  • Spring AI 整合OpenAI 聊天、做图
  • 阿里Motionshop人物角色替换成3D虚拟形象