【设计模式-外观】

这里写自定义目录标题

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

定义

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

UML图

在这里插入图片描述

角色作用

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

代码

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

// 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");}
}

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

// 家庭影院外观类
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();}
}

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

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

使用场景

  • 为复杂子系统提供复杂接口
  • 客户程序和抽象实现部分存在很大依赖性,引入facade隔离客户和子系统

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/53022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS上谷歌浏览器的十大隐藏功能

谷歌浏览器(Google Chrome)在macOS上拥有一系列强大而隐蔽的特性,这些功能能显著提高您的浏览体验。从多设备同步到提升安全性和效率,这些被低估的功能等待着被发掘。我们将逐步探索这些功能,帮助您最大化利用谷歌浏览…

力扣题解815

大家好,欢迎来到无限大的频道。祝大家中秋节快乐​。 今日继续给大家带来力扣题解。 题目描述(困难)​: 公交路线 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路&…

Python logging库(python日志库)Logger(记录器、收集器、采集器)、Handler(处理器)、Formatter(格式化器)、Log Level(日志级别)

文章目录 Python Logging库详解简介日志记录的基本概念1. Logger(记录器):这是日志系统的入口点。每个记录器都有一个名称,并且记录器之间可以存在父子关系。2. Handler(处理器):记录器将日志消…

网络安全-intigriti-0422-XSS-Challenge Write-up

目录 一、环境 二、解题 2.1看源码 一、环境 Intigriti April Challenge 二、解题 要求:弹出域名就算成功 2.1看源码 我们看到marge方法,肯定是原型链污染题目 接的是传参,我们可控的点在于qs.config和qs.settings,这两个可…

Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)

文章目录 3.4 接口隔离原则(ISP)3.4.1 概述3.4.2 案列 3.4 接口隔离原则(ISP) 接口隔离原则:Interface Segregation Principle,简称ISP 3.4.1 概述 客户端测试类不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接…

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具

关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具,旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器,该解析器处理标记化和语法树解析以及众多自定义属性&#x…

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来,最近发布了一款批量插入图片的插件,欢迎大家下载,免费试用。 这是图片的文件夹: 主要功能如下: 1,匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…

腾讯百度阿里华为常见算法面试题TOP100(4):双指针、哈希、滑动窗口

之前总结过字节跳动TOP50算法面试题: 字节跳动常见算法面试题top50整理_沉迷单车的追风少年-CSDN博客_字节算法面试题 目录 双指针 42.接雨水 283.移动零 11.盛最多水的容器 15.三数之和 哈希 1. 两数之和 49.字母异位词分组 128.最长连续序列 滑动窗…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度(4位)2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

SQL进阶的技巧:如何实现某列的累计乘积?

目录 0 场景描述 1 数据准备 2 问题分析 3 完全情况查询 4 小结 0 场景描述 在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一场景,通过某种条件找到一列数据[X1,X2,X3...Xn],然后想要求y=X1X2X3...Xn。下面给出一个具体案例来详细解释这一问题,如下图所示…

学成在线练习(HTML+CSS)

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

大模型入门3:理解LLAMA

LLama在transformers库中的代码,以及各部分原理Llama3.1技术报告LLama 33b 微调尝试 Model a stack of DecoderBlocks(SelfAttention, FeedForward, and RMSNorm) decoder block 整体结构:最大的区别在pre-norm x -> norm(x) -> attention() -…

什么是上拉,下拉?

上拉就是将引脚通过一个电阻连接到电源,作用:1.使IO口的不确定电平稳定在高点平,2、为了增加IO口拉电流的能力。 下拉就是将引脚通过一个电阻与GND相连,作用:1.从器件输出电流 2.当IO口为输入状态时,引脚的…

【爱给网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

Flet全平台开发:软件开发界勇士为Python语言补短板的一次极具挑战性的尝试、冲刺和华丽亮相

一、Flet创始人和开发者介绍、开发Flet的背景介绍 Flet 的创始人和开发者 Feodor Fitsner 是俄罗斯人,就职于微软。 Flet 的第一个版本于 2022 年 6 月发布。这是一个相对较新的库,它基于 Flutter 框架,首先支持的是用 Python 语言开发软件…

速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器

一,地址的概念 通常所说的地址指的是某内存单元在整个机器内存中的物理地址,把整个机器内存比作一个酒店,内存单元就是这个酒店的各个房间,给这些房间编的门牌号,类比回来就是内存单元的物理地址 在第一篇介绍debug的…

文心智能体应用:美国旅游助手的诞生

创造灵感 在如今的数字化时代,旅行体验越来越依赖于智能技术的辅助。从机票预订到行程安排,再到当地美食推荐,智能助手在旅行中的作用愈发重要。尤其在美国这样一个广袤且多样化的国家,拥有一个智能旅行助手能够极大地提升游客的…

C++3D迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(char strmaze[5][5][5]) {cout << "-----" << endl;int i 0;int ia 0…

react18基础教程系列--安装环境及packagejson文件分析

一个React项目中&#xff0c;默认会安装: react:React框架的核心react-dom:React 视图渲染的核心「基于React构建WebApp(HTML页面)J—>react-native:构建和渲染App的react-scripts: 脚手架为了让项目目录看起来干净一些&#xff0c;把webpack打包的规则及相关的插件/LOADER…

《OpenCV计算机视觉》—— 图像金字塔

文章目录 什么是图像金字塔&#xff1f;一、定义与基本原理二、主要类型三、构建过程四、应用领域 图像金字塔中的下采样和上采样一、下采样&#xff08;Downsampling&#xff09;二、上采样&#xff08;Upsampling&#xff09;三、总结 代码实现 什么是图像金字塔&#xff1f;…