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();
    }
}

🧩 优点

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

⚠️ 缺点

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

✅ 使用建议

适用于:

  • 系统复杂度高、子系统繁多的情况
  • 为旧系统封装一层适配接口
  • 需要定义入口统一调用多个类的场景
相关推荐
2401_838472513 分钟前
使用Python处理计算机图形学(PIL/Pillow)
jvm·数据库·python
80530单词突击赢4 分钟前
C++关联容器深度解析:set/map全攻略
java·数据结构·算法
m0_561359674 分钟前
代码热更新技术
开发语言·c++·算法
兩尛11 分钟前
c++知识点1
java·开发语言·c++
凯子坚持 c11 分钟前
Qt常用控件指南(9)
开发语言·qt
ONE_PUNCH_Ge12 分钟前
Go 语言泛型
开发语言·后端·golang
舟舟亢亢13 分钟前
JVM复习笔记——下
java·jvm·笔记
rainbow688915 分钟前
Python学生管理系统:JSON持久化实战
java·前端·python
2301_7903009626 分钟前
用Matplotlib绘制专业图表:从基础到高级
jvm·数据库·python
有味道的男人28 分钟前
1688获得商品类目调取商品榜单
java·前端·spring