23种设计模式-结构型模式之外观模式(Java版本)

Java 外观模式(Facade Pattern)详解

🧭 什么是外观模式?

外观模式是结构型设计模式之一,为子系统中的一组接口提供一个统一的高层接口,使得子系统更易使用

就像是酒店前台,帮你处理入住、叫车、订餐等各种服务,让你不用和多个部门打交道。


🧠 使用场景

  • 简化复杂系统的操作流程
  • 封装子系统,提高代码可维护性
  • 为旧系统提供统一的接口

🏗️ 模式结构

  • Facade(外观类):对外提供统一接口,封装子系统
  • Subsystem(子系统类):各个独立的模块或类,完成实际业务

✅ 示例:家庭影院系统

子系统类

java 复制代码
public class DVDPlayer {
    public void on() { System.out.println("DVD 播放器打开"); }
    public void play() { System.out.println("DVD 播放电影"); }
    public void off() { System.out.println("DVD 播放器关闭"); }
}

public class Projector {
    public void on() { System.out.println("投影仪打开"); }
    public void off() { System.out.println("投影仪关闭"); }
}

public class Screen {
    public void down() { System.out.println("幕布放下"); }
    public void up() { System.out.println("幕布收起"); }
}

外观类

java 复制代码
public class HomeTheaterFacade {
    private DVDPlayer dvd;
    private Projector projector;
    private Screen screen;

    public HomeTheaterFacade() {
        dvd = new DVDPlayer();
        projector = new Projector();
        screen = new Screen();
    }

    public void watchMovie() {
        System.out.println("准备观看电影...");
        screen.down();
        projector.on();
        dvd.on();
        dvd.play();
    }

    public void endMovie() {
        System.out.println("电影结束,关闭设备...");
        dvd.off();
        projector.off();
        screen.up();
    }
}

客户端调用

java 复制代码
public class Main {
    public static void main(String[] args) {
        HomeTheaterFacade home = new HomeTheaterFacade();
        home.watchMovie();
        home.endMovie();
    }
}

🧩 优点

  • 简化客户端使用,提高系统易用性
  • 松散耦合,降低子系统之间依赖
  • 更好地组织代码结构

⚠️ 缺点

  • 增加额外的外观类
  • 可能造成"上帝类"问题(职责过重)

✅ 使用建议

适用于:

  • 系统复杂度高、子系统繁多的情况
  • 为旧系统封装一层适配接口
  • 需要定义入口统一调用多个类的场景
相关推荐
JQLvopkk4 分钟前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
忧郁的Mr.Li12 分钟前
SpringBoot中实现多数据源配置
java·spring boot·后端
玄同76517 分钟前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
czy878747519 分钟前
深入了解 C++ 中的 `std::bind` 函数
开发语言·c++
消失的旧时光-194324 分钟前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
yq19820430115625 分钟前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class26 分钟前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
有位神秘人27 分钟前
kotlin与Java中的单例模式总结
java·单例模式·kotlin
Jinkxs28 分钟前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&28 分钟前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin