【设计模式-外观】

这里写自定义目录标题

  • 定义
  • 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.rhkb.cn/news/425749.html

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

相关文章

pdf去水印怎么去掉免费?6个pdf去除水印的方法快码住,超级好用!

pdf去水印怎么去掉免费?您是否有一些带有水印的pdf文档,让您感觉到头疼?您又是否希望能够去除这些水印,或者想用其他水印来替换现有的水印?如果是这样的话,我非常推荐您继续阅读本篇文章。本文将为您提供一…

openeuler 22.03 lts sp4 使用 kubeadm 部署 k8s-v1.28.2 高可用集群

文章目录 [toc]废话篇这篇文章什么时候写的为什么是 openeuler为什么是 22.03 lts sp4高可用架构题外话 干活篇环境介绍系统初始化相关关闭防火墙关闭 selinux关闭 swap开启内核模块开启模块自动加载服务 sysctl 内核参数调整清空 iptables 规则安装各种依赖和工具修改 .bashrc…

Qt --- 信号和信号槽

前言 Linux信号Signal,系统内部的通知机制,进程间通信方式。 信号源:谁发的信号。 信号的类型:哪种类别的信号。 信号的处理方式:注册信号处理函数,在信号被触发的时候自动调用执行。 Qt中的信号和Lin…

JUC学习笔记(三)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 八、共享模型之工具--JUC8.1 AQS 原理1. 概述2 实现不可重入锁自定义同步器自定义锁 3.心得起源目标设计1) state 设计2)阻塞恢复设计3)队列…

计算机毕业设计选题推荐-共享图书管理系统-小程序/App

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法

这个方法是摸索出来的,也不一定对: 1、驱动层module_init(module_init_function)作为模块初始化,并且提供模块内部初始化的函数名; 2、找到所有驱动目录drivers下所有module_init(module_init_function),在内核6.9.0…

你的绩效是不是常年都是B

原创不易,求赞,求关注,🙏🙏🙏🙏🙏🙏🙏🙏 目录 原创不易,求赞,求关注,🙏🙏&#x1f64…

http连接github远程仓库密码问题解决办法

目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…

图像滤波---各项异性扩散滤波使用笔记及代码

图像滤波---各项异性扩散滤波使用笔记及代码 一、文章内容介绍二、各项异性扩散滤波和各项同性滤波1、各项同性滤波2、各项异性扩散滤波3、各项异性和各项同性的对比 三、各项异性扩散滤波的原理介绍四、各项异性扩散滤波公式五、公式中的参数使用说明1、扩散速率 λ \lambda λ…

kubernetes中pause容器的作用与源码详解

概述 摘要:上一篇文章我们介绍了kubernetes是如何通过pause容器来构建一个pod。本文我们对pause容器做一个总结,并再此基础上次深入浅出,从pause容器的源码详细了解pause容器的实现原理。 正文 pause容器是什么 在 Kubernetes 中&#xff…

STM32(十五):I2C通信

I2C通信 I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线,实现单片机读写外部模块寄存器的功能。 两根通信线:SCL(Serial Clock)、SDA(Serial Data) 同步,半双工…

css百分比布局中height:100%不起作用

百分比布局时,我们有时候会遇到给高度 height 设置百分比后无效的情况,而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时,是相对于父元素的高度来计算的。当没有给父元素设置高度(height)时或设置…

Celery的使用

Celery 一、Celery概述1. 特点:2. celery组成3. 安装与使用4. 邮箱配置二、Celery的使用实操——发送邮件1. 安装2. 配置一、Celery概述 1. 特点: 2. celery组成 配置任务队列Broker,采用redis保存要执行的任务队列 Client:任务的发出者 Worker:任务的处理者 3. 安装与使用…

『功能项目』第三职业弓弩的平A【58】

我们打开上一篇57第二职业法师的平A的项目, 本章要做的事情是实现第三职业弓弩的平A伤害 首先修改脚本:MagicBall.cs 将脚本挂载在Sphere预制体身上 注意组件设置 运行项目 本章做了第三职业弓弩的平A伤害及显示伤害UI 接下来文章的内容: …

如何升级用 Helm 安装的极狐GitLab Runner?

本分分享如何对 Helm 安装的 Runner 进行升级。整个过程分为三步:1、确定 Runner 最新版本或者想要升级的版本是否存在;2、用 Helm upgrade 命令进行升级;3、升级确认。 极狐GitLab 为 GitLab 的中国发行版,中文版本对中国用户更…

Mac笔记本上查看/user/目录下的文件的几种方法

在Mac笔记本上查看/user/下的文件,可以通过多种方法实现。以下是一些常见的方法: 一、使用Finder 打开Finder:点击Dock栏中的Finder图标,或者使用快捷键Command F。 导航到用户目录: 在Finder的菜单栏中&#xff0…

编译运行 webAssembly(wasm)

环境准备&#xff1a; lunix下docker 参考https://hub.docker.com/r/emscripten/emsdk 拉编译环境 docker pull emscripten/emsdk 编译 随便找个目录&#xff0c;敲下面命令&#xff0c;编译一个webAssembly 程序 # create helloworld.cpp cat << EOF > hellowo…

【nginx】搭配okhttp 配置反向代理

nginx的默认是一个反向代理。 nginx会默认把输入的请求,转向其他的服务器执行。 这些转向的服务器与客户端发起的服务器不是同一个。 客户端只认识nginx,不知道ngiix转向何方。 正向代理修改okhttp的proxy,实际上很多代理都是正向的。 反向代理修改请求路径到nginx。 感觉还…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天&#xff0c;越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段&#xff0c;能够帮助用户识别和检测IP代理的使用情况&#xff0c;从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

鸿蒙开发之ArkUI 界面篇 五

Image 图片组件&#xff0c;用专门用于显示图片 语法&#xff1a;Image(图片源)&#xff0c;这里可以是网络、也可以是本地的图片 例如&#xff1a;Image(https://wxls-cms.oss-cn-hangzhou.aliyuncs.com/online/2024-04-18/218da022-f4bf-456a-99af-5cb8e157f7b8.jpg)效果如下…