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

🧩 优点

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

⚠️ 缺点

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

✅ 使用建议

适用于:

  • 系统复杂度高、子系统繁多的情况
  • 为旧系统封装一层适配接口
  • 需要定义入口统一调用多个类的场景
相关推荐
学到头秃的suhian22 分钟前
Maven
java·maven
QX_hao24 分钟前
【Go】--反射(reflect)的使用
开发语言·后端·golang
小坏讲微服务28 分钟前
Docker-compose 搭建Maven私服部署
java·spring boot·后端·docker·微服务·容器·maven
chxii28 分钟前
Maven 详解(下)
java·maven
inferno29 分钟前
Maven基础(二)
java·开发语言·maven
杨武博29 分钟前
关于maven中pom依赖冲突问题记录
java·maven
我是李武涯1 小时前
从`std::mutex`到`std::lock_guard`与`std::unique_lock`的演进之路
开发语言·c++
史不了2 小时前
静态交叉编译rust程序
开发语言·后端·rust
陈果然DeepVersion2 小时前
Java大厂面试真题:Spring Boot+Kafka+AI智能客服场景全流程解析(十)
java·spring boot·ai·kafka·面试题·向量数据库·rag
读研的武2 小时前
DashGo零基础入门 纯Python的管理系统搭建
开发语言·python