【设计模式-外观】

这里写自定义目录标题

定义

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

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隔离客户和子系统
相关推荐
lcanfly几秒前
Mysql作业5
android·数据库·mysql
9号达人12 分钟前
普通公司对账系统的现实困境与解决方案
java·后端·面试
超级苦力怕15 分钟前
Java 为何 long a = 999999999 能过;long a = 9999999999 报错?一文讲透“宽化转换”
java
佐杰20 分钟前
Jenkins使用指南1
java·运维·jenkins
dllxhcjla31 分钟前
三大特性+盒子模型
java·前端·css
Acrelhuang36 分钟前
筑牢用电防线:Acrel-1000 自动化系统赋能 35kV 园区高效供电-安科瑞黄安南
java·大数据·开发语言·人工智能·物联网
脸大是真的好~39 分钟前
黑马JAVAWeb-10 文件上传-文件存储到服务器本地磁盘-文件存储在阿里云OSS-@Value属性注入
java
大G的笔记本1 小时前
算法篇常见面试题清单
java·算法·排序算法
亚林瓜子1 小时前
Spring中的异步任务(CompletableFuture版)
java·spring boot·spring·async·future·异步
MuYiLuck1 小时前
redis持久化与集群
java·数据库·redis