【设计模式-外观】

server/2024/9/22 9:15:50/

这里写自定义目录标题

  • 定义
  • UML图
  • 角色作用
  • 代码
  • 使用场景

定义

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

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隔离客户和子系统

http://www.ppmy.cn/server/118408.html

相关文章

fmql之ubuntu移植

官方资料:ubuntu18的压缩包 目的:放到SD卡中启动ubuntu(官方是放在emmc中) 教程:99_FMQL45_大黄蜂开发板跑ubuntu18.04.docx 所需文件 其中,format_emmc_ext4.txt对emmc的分区是512M(放上述文…

算法打卡:第九章 动态规划part12

今日收获:不同的子序列,两个字符串的删除操作,编辑距离 1. 不同的子序列 题目链接:115. 不同的子序列 - 力扣(LeetCode) 思路: (1)dp数组表示两个字符串 i-1,j-1位置…

Linux审计系统软件auditd简介

Linux审计系统软件auditd是一个强大的工具,用于监控和记录安全相关的信息。它最初是基于Linux 2.6.11.12版本内核开发的,主要的审计机制代码位于kernel/audit.c和kernel/auditsc.c中[^4]。auditd可以记录系统调用和文件访问等事件,帮助系统管…

TCP协议分析《实验报告》

一、实验目的 1、理解TCP协议; 2、掌握TCP协议三次握手建立连接和四次挥手释放连接的过程; 3、理解TELNET协议及工作过程; 4、掌握TCP协议分析方法。 二、实验设备和环境 1、硬件设备:PC机或笔记本电脑; 2、软件…

学成在线练习(HTML+CSS)

准备工作 项目目录 内部包含当前网站的所有素材,包含 HTML、CSS、图片、JavaScript等等 1.由于元素具有一些默认样式,可能是我们写网页过程中根本不需要的,所有我们可以在写代码之前就将其清除 base.css /* 基础公共样式:清除…

UE5中使用UTexture2D进行纹理绘制

在UE中有时需要在CPU阶段操作像素,生成纹理贴图等,此时可以通过UTexture2D来进行处理,例子如下: 1.CPP部分 首先创建一个蓝图函数库,将UTexture2D的绘制逻辑封装成单个函数: .h: #include &…

[项目][WebServer][构建响应 发送响应]详细讲解

目录 1.构建响应2.发送响应 1.构建响应 构建响应流程如下 确认方法根据不同方法,以不同方法提参确认访问资源 如果用户的URL没有指明要访问的某种资源(路径),虽然浏览器默认会添加/,但是依旧没有告知服务器,要访问什么资源 此时&…

Ubuntu 22.04 LTS 上安装 Docker

单台机器安装docker环境,是为了后面安装open-webui,环境安装比较简单,没有难点,但一定要按步骤走,否则还是会遇到一些问题的。 第 1 步:更新软件包并安装必要软件 运行以下命令,更新软件包索引…