【设计模式-外观】

这里写自定义目录标题

定义

为子系统中一组相关接口提供一致界面,定义一个高级接口,使得子系统更加容易使用。

UML图

角色作用

  • 外观(Facade)角色:这是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求代理给适当的子系统对象。外观角色通常是单例的,以确保它在整个系统中只有一个实例,为所有客户端提供一致的服务。
  • 子系统(Subsystem)角色:可以有一个或多个子系统类,每个子系统实现了一部分特定的功能。这些子系统类通常是复杂的,并且它们之间可能存在复杂的交互关系。外观模式的目的就是要封装这些子系统的复杂性,使客户端不需要直接与这些复杂的子系统交互。

代码

子系统类

假设我们正在构建一个家庭影院系统,它包含多个子系统,如 DVD 播放器、投影仪和音响。

java 复制代码
// DVD 播放器子系统
class DVDPlayer {
    public void on() {
        System.out.println("DVD player is on");
    }

    public void play(String movie) {
        System.out.println("Playing movie: " + movie);
    }

    public void off() {
        System.out.println("DVD player is off");
    }
}

// 投影仪子系统
class Projector {
    public void on() {
        System.out.println("Projector is on");
    }

    public void wideScreenMode() {
        System.out.println("Projector is in widescreen mode");
    }

    public void off() {
        System.out.println("Projector is off");
    }
}

// 音响子系统
class Stereo {
    public void on() {
        System.out.println("Stereo is on");
    }

    public void setVolume(int volume) {
        System.out.println("Stereo volume set to " + volume);
    }

    public void off() {
        System.out.println("Stereo is off");
    }
}

外观类

外观类将提供给客户端一个简单统一的接口来操作家庭影院系统。

java 复制代码
// 家庭影院外观类
class HomeTheaterFacade {
    private DVDPlayer dvdPlayer;
    private Projector projector;
    private Stereo stereo;

    public HomeTheaterFacade() {
        dvdPlayer = new DVDPlayer();
        projector = new Projector();
        stereo = new Stereo();
    }

    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        dvdPlayer.on();
        projector.on();
        projector.wideScreenMode();
        stereo.on();
        stereo.setVolume(10);
        dvdPlayer.play(movie);
    }

    public void endMovie() {
        System.out.println("Shutting down the movie theater...");
        dvdPlayer.off();
        projector.off();
        stereo.off();
    }
}

客户端类

客户端可以通过外观类简单地操作家庭影院系统,而无需直接与各个子系统交互。

java 复制代码
public class FacadePatternExample {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade();
        homeTheater.watchMovie("The Dark Knight");
        homeTheater.endMovie();
    }
}

使用场景

  • 为复杂子系统提供复杂接口
  • 客户程序和抽象实现部分存在很大依赖性,引入facade隔离客户和子系统
相关推荐
你怎么知道我是队长30 分钟前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
damoluomu1 小时前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
我命由我123451 小时前
Python 实用操作 - 文件操作(打开与关闭文件、读取文件、文件写入)
java·开发语言·前端·javascript·数据库·python·java-ee
MiyamuraMiyako1 小时前
Compose LazyRow 实现尾项露出与少量数据均分
android·android jetpack
booboosui2 小时前
输入法借 350 毫秒:给 agent 打字的两条路
android
学长毕设2 小时前
基于SpringBoot的网上流浪狗救助捐赠平台-附源码
java·spring boot·后端
VimorphTech2 小时前
文本已经改了,旧的音频生成结果还能回写吗?
java·数据库·mybatis
SL_staff2 小时前
BI项目90%失败?JVS三阶闭环实践:从数据打通到业务嵌入的技术路径
java·开源·全栈
aiks_yuan2 小时前
一个端口能被两个程序同时监听吗:SO_REUSEADDR、SO_REUSEPORT Java 实测和 Spring Boot 端口被占照样启动的坑
java
雷✘2 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++