当前位置: 首页 > news >正文

设计模式: 外观模式

文章目录

  • 一、什么是外观模式
  • 二、外观模式结构
    • 1、外观模式的主要角色包括:
    • 2、外观模式通常适用于以下情况:
  • 三、优点

一、什么是外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用来访问系统中的一群接口,从而简化客户端与系统之间的交互。外观模式通过引入一个外观类来封装子系统的复杂性,使得客户端只需要与外观类交互,而无需直接与子系统的各个组件打交道。

在外观模式中,外观类充当了客户端与子系统之间的中介者,隐藏了子系统的复杂性,为客户端提供了一个更简单和统一的接口。客户端通过外观类来访问系统的功能,而不需要了解系统内部各个组件之间的关系和调用方式。

二、外观模式结构

1、外观模式的主要角色包括:

  • 外观类(Facade):对客户端提供简单接口的类,负责将客户端的请求转发给子系统中相应的对象处理。
  • 子系统(Subsystems):由多个组件或类组成的复杂系统,外观类封装了这些组件的功能。

2、外观模式通常适用于以下情况:

  • 当系统中存在复杂的子系统,需要提供一个简单统一的接口给客户端使用时。
  • 当需要将系统的各个组件解耦,减少它们之间的依赖关系时。

简单的示例:

// 子系统组件
class MusicPlayer {public void play() {System.out.println("Playing music");}
}class Amplifier {public void on() {System.out.println("Amplifier on");}public void off() {System.out.println("Amplifier off");}
}class Speaker {public void open() {System.out.println("Speaker open");}public void close() {System.out.println("Speaker close");}
}// 外观类
class AudioFacade {private MusicPlayer musicPlayer;private Amplifier amplifier;private Speaker speaker;public AudioFacade() {this.musicPlayer = new MusicPlayer();this.amplifier = new Amplifier();this.speaker = new Speaker();}public void startMusic() {amplifier.on();speaker.open();musicPlayer.play();}public void stopMusic() {musicPlayer.stop();speaker.close();amplifier.off();}
}// 客户端代码
public class Main {public static void main(String[] args) {AudioFacade audioFacade = new AudioFacade();audioFacade.startMusic();}
}

三、优点

外观模式的优点包括:

  • 简化接口:客户端只需与外观类交互,无需了解系统的复杂性。
  • 解耦客户端和子系统:外观类作为中介者,降低了客户端和子系统之间的耦合度。
  • 提高灵活性:可以随时修改外观类以适应系统变化,而不会影响客户端代码。

相关文章:

设计模式: 外观模式

文章目录 一、什么是外观模式二、外观模式结构1、外观模式的主要角色包括:2、外观模式通常适用于以下情况: 三、优点 一、什么是外观模式 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口&…...

Samba局域网共享文件

基于两个协议:smb协议(Server Message Block,服务消息块)和cifs协议(Common Internet File System,通用互联网文件系统) 两个主进程:smbd 和nmbd进程。 smbd:提供对服务…...

基于FPGA实现的UDP协议栈设计_汇总

基于FPGA实现的千兆以太网UDP协议栈设计(汇总篇) 1. MAC设计 2. IP层设计 3. ARP层设计 4. UDP层设计 5. ICMP层设计 6. 仲裁器设计 8. RGMII接口设计 9. 跨时钟域设计...

maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法

背景: 在Maven私服手动上传了第三方的jar包, 只有jar包, 没有pom文件, 项目在ide中可以正常编译启动,但打包报错无法找到jar包 解决办法: 上传jar包的时候, 点击生成pom. 则打包的时候不会报错...

利用Scala与Apache HttpClient实现网络音频流的抓取

概述 在当今数字化时代,网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合Apache HttpClient工具库实现网络音频流的抓取。通过本文,读者将学习如何利用强大的Scala语言和Apache HttpClient库来抓取网…...

Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)

假如数据库在本地,没有放在Linux中 1.先把数据库中root的主机改成% 2.项目中的数据库链接配置换成本机ip 3.打包 4.把打包好的jar包放到Linux中 一般把jar包放到opt下 5.把前端部分拷贝到Linux的nginx中 5.1在package.json中修改build的值为图中这样 5.2同时由于在…...

InnoDB 缓存

本文主要聊InnoDB内存结构, 先来看下官网Mysql 8.0 InnoDB架构图 MySQL :: MySQL 8.0 Reference Manual :: 17.4 InnoDB Architecture 如上图所示,InnoDB内存主要包含Buffer Pool, Change Buffer, Log Buffer, Adaptive Hash Index Buffer Pool 其实 buffer pool 就是内存中的…...

目标检测——PP-YOLOE-R算法解读

PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…...

轻松解锁微博视频:基于Perl的下载解决方案

引言 随着微博成为中国最受欢迎的社交平台之一,其内容已经变得丰富多彩,特别是视频内容吸引了大量用户的关注。然而,尽管用户对微博上的视频内容感兴趣,但却面临着无法直接下载这些视频的难题。本文旨在介绍一个基于Perl的解决方…...

asp.net mvc 重新引导视图路径,改变视图路径

asp.net mvc 重新引导视图路径,改变视图路径 使用指定的控制器上下文和母版视图名称来查找指定的视图 通过本文学习,你可以根据该技法,去实现,站点自定义皮肤,手机站和电脑站,其他设备站点,在不…...

《优化接口设计的思路》系列:第九篇—用好缓存,让你的接口速度飞起来

一、前言 大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农&#xff0c…...

专业130+总分410+西南交通大学924信号与系统考研经验西南交大电子信息通信工程,真题,大纲,参考书。

初试分数出来,专业课924信号与系统130,总分410,整体上发挥正常,但是还有遗憾,其实自己可以做的更好,总结一下经验,希望对大家有所帮助。专业课:(130) 西南交…...

MySQL数据库 - 存储引擎

一. mysql 存储引擎的相关知识 1.1 存储引擎的概念 MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是My…...

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测

时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于BiTCN-LSTM双向时间卷积长短期记忆神经网络时…...

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景: Sentinel 承接了阿里巴…...

android gdb 调试

gdbgdbserver远程调试技术(一)——调试环境搭建_gdbserver 远程调试-CSDN博客 GDB/gdbserver 7.4.1 for Android with NEON support (gnutoolchains.com) sudo apt-get install texinfo$ tar zxvf gdb-7.12.tar.gz $ cd gdb-7.12/$ mkdir build$ cd bu…...

分布式搜索引擎elasticsearch专栏二

上一篇的传送门: 分布式搜索引擎elasticsearch专栏一-CSDN博客 这一篇博文主要讲解elasticsearch的数据搜索功能。下面会分别使用DSL和RestClient实现搜索。 1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsea…...

LeetCode第一天(495.提莫攻击)

题目: 在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。 当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。 正式地讲,提…...

SQL运维_Unix下MySQL-8.0.18配置文件示例

SQL运维_Unix下MySQL-8.0.18配置文件示例 MySQL 是一个关系型数据库管理系统, 由瑞典 MySQL AB 公司开发, 属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一, 在 WEB 应用方面, MySQL 是最好的 RDBMS (Relational Database Management System, 关系数据库管…...

python_BeautifulSoup爬取汽车评论数据

爬取的网站: 完整代码在文章末尾 https://koubei.16888.com/57233/0-0-0-2 使用方法: from bs4 import BeautifulSoup 拿到html后使用find_all()拿到文本数据,下图可见,数据标签为: content_text soup.find_all…...

Go Context 生命周期控制逻辑解析

Go语言中的Context是控制并发任务生命周期的核心机制,它像一根隐形的线,贯穿于Goroutine的创建、执行和终止全过程。本文将深入解析Context如何通过精巧的设计实现超时控制、级联取消和数据传递,帮助开发者构建更健壮的分布式系统。理解其生命…...

Synopsys Multivoltage Flow User Guide(汉化笔记)

1 Low-Power Design Strategies 1.1 Increasing Challenges of Power 早期的IC设计中EDA工具更多的优化方向是性能和面积,功耗考虑的比较少,但是,现在的设计CMOS器件密度和时钟频率都在提升,功耗重要性也更加明显,供电电压和晶体管阈值电压也在降低,漏电电流也成为无法忽…...

数字生成器(骰子模拟器)

输入两个数(a,b)&#xff0c;随机输出一个在a与b之间的数#include <bits/stdc.h> using namespace std;int main( ) {int c, j, r;cin >> c >> j;srand((unsigned)time(nullptr));for (int i 0; i < 1; i) {r rand() % c j - c;cout << r <&l…...

打破信息壁垒:Bypass Paywalls Chrome Clean的技术实现与伦理边界

打破信息壁垒&#xff1a;Bypass Paywalls Chrome Clean的技术实现与伦理边界 核心痛点&#xff1a;数字时代的知识获取困境 独立创作者的内容付费墙困境 &#x1f58b;️ 独立科技作者李明在撰写行业分析报告时&#xff0c;需要参考多家商业媒体的深度报道。然而&#xff0c;每…...

BGE-M3移动端部署:Android/iOS调用BGE-M3嵌入服务SDK封装

BGE-M3移动端部署&#xff1a;Android/iOS调用BGE-M3嵌入服务SDK封装 1. 项目背景与价值 BGE-M3是一个专门为检索场景设计的三合一"多功能"文本嵌入模型。它集成了密集检索、稀疏检索和多向量检索三种模式&#xff0c;能够在不同场景下提供最优的文本相似度计算能力…...

Twisted:开源栈式 JS 虚拟机(JSVMP)功能介绍、痛点、后续计划

Twisted&#xff1a;开源栈式 JS 虚拟机&#xff08;JSVMP&#xff09;功能介绍、痛点、后续计划 仓库&#xff1a;github.com/0xfffb/twisted 测试地址&#xff1a;click 定位 Twisted 是用 TypeScript 实现的栈帧式 JSVMP 工具链&#xff1a;将子集 JavaScript 编译为自定…...

用 Shield CLI 本地开发调试:从零到上线你的第一个 Skill

当 AI Agent 需要调用外部能力时&#xff0c;Skill 就是它的"技能包"。本文以一个文旅素材搜索 Skill 为例&#xff0c;带你走完本地开发 → 调试 → 发布 → 安装使用的完整流程。核心工具只有一个 —— Shield CLI。 背景&#xff1a;什么是 Skill&#xff1f; Sk…...

企业为什么开始用小程序替代官网?

企业为什么开始用小程序替代官网?一、核心结论企业开始用小程序替代传统官网&#xff0c;本质上不是“技术替代”&#xff0c;而是获客方式与用户行为的变化。当用户从“搜索访问网站”转向“在平台内直接完成浏览与交易”时&#xff0c;小程序在转化效率与使用路径上更具优势…...

[具身智能-320]:语料库就是“语言材料的仓库”。

简单来说&#xff0c;语料库就是“语言材料的仓库”。在人工智能和语言学领域&#xff0c;它指的是经过科学取样、加工和整理的大规模电子文本或数据集合。如果把大语言模型&#xff08;LLM&#xff09;比作一个正在上学的孩子&#xff0c;那么语料库就是它读的“书”、做的“题…...

Untrunc视频修复工具:让损坏的MP4文件重获新生

Untrunc视频修复工具&#xff1a;让损坏的MP4文件重获新生 【免费下载链接】untrunc Restore a damaged (truncated) mp4, m4v, mov, 3gp video. Provided you have a similar not broken video. 项目地址: https://gitcode.com/gh_mirrors/unt/untrunc 当你熬夜剪辑完成…...