九、外观模式

外观模式(Facade Pattern)是一种结构型设计模式,有叫门面模式,它为一个复杂子系统提供一个简单的接口,隐藏系统的复杂性。通过使用外观模式,客户端可以更方便地和复杂的系统进行交互,而无需直接与系统内部的各个组成部分打交道。

主要组成部分:

  1. 外观类(Facade)

    • 提供一个简单的接口,供客户端调用。
  2. 子系统类(SubSystem)

    • 复杂的子系统,提供具体的功能实现。
  3. 客户端(Client)

    • 需要通过外观与复杂子系统交互的对象。

优点:

  1. 简化接口:外观模式提供的接口使客户端与复杂系统的交互变得简单明了。
  2. 降低耦合度:客户端与复杂系统的具体实现解耦,减少了依赖关系。
  3. 提高可维护性:通过外观模式,可以轻松更改和维护内部系统的实现,而不影响客户端代码。

使用场景:

  • 当需要为一个复杂的系统提供一个简单的入口时。
  • 当多个类一起工作时,可以用外观模式将其封装,提高系统的可用性。
  • 提升模块之间的解耦性。

JAVA:

演示如何为一个复杂的家庭影院系统提供一个简单的接口

// 子系统-音响系统
public class Amplifier {public void on() {System.out.println("音响打开:");}public void setVolume(int level) {System.out.println("音响音量设置: " + level);}
}
// 子系统-DVD播放器
public class DVDPlayer {public void on() {System.out.println("DVD 开关打开:");}public void play(String movie) {System.out.println("播放电影: " + movie);}
}
// 子系统-投影仪
public class Projector {public void on() {System.out.println("投影仪开关打开:");}public void wideScreenMode() {System.out.println("投影仪在宽屏模式");}
}
// 外观类
public class HomeTheaterFacade {private Amplifier amplifier; //音响private DVDPlayer dvdPlayer; //播放器private Projector projector; //投影仪// 构造public HomeTheaterFacade(Amplifier amp, DVDPlayer dvd, Projector proj) {this.amplifier = amp;this.dvdPlayer = dvd;this.projector = proj;}public void watchMovie(String movie) {System.out.println("准备好看电影……");amplifier.on();amplifier.setVolume(5);dvdPlayer.on();dvdPlayer.play(movie);projector.on();projector.wideScreenMode();}
}

 

@Test(description = "外观模式")public void facadeTest(){Amplifier amplifier = new Amplifier();DVDPlayer dvdPlayer = new DVDPlayer();Projector projector = new Projector();HomeTheaterFacade homeTheater = new HomeTheaterFacade(amplifier, dvdPlayer, projector);homeTheater.watchMovie("《盗梦空间》");}

GO: 

package facadeimport "fmt"// IHomeTheater 接口
type IHomeTheater interface {On()
}// Amplifier 子系统-音响系统
type Amplifier struct{}func NewAmplifier() *Amplifier {return &Amplifier{}
}
func (a Amplifier) On() {fmt.Println("音响开关打开、")
}
func (a Amplifier) setVolume(level int64) {fmt.Println("音响音量设置: ", level)
}// DVDPlayer 子系统-DVD播放器
type DVDPlayer struct{}func NewDVDPlayer() *DVDPlayer {return &DVDPlayer{}
}
func (D DVDPlayer) On() {fmt.Println("DVD播放器开关打开:")
}
func (D DVDPlayer) play(movie string) {fmt.Println("播放电影:", movie)
}// Projector 子系统-投影仪
type Projector struct{}func NewProjector() *Projector {return &Projector{}
}
func (p Projector) On() {fmt.Println("投影仪开关打开")
}
func (p Projector) wideScreenMode() {fmt.Println("投影仪在宽屏模式")
}// HomeTheater 外观类
type HomeTheater struct {amplifier *AmplifierdVDPlayer *DVDPlayerprojector *Projector
}func NewHomeTheater(amp *Amplifier, dVD *DVDPlayer, pro *Projector) *HomeTheater {return &HomeTheater{amplifier: amp,dVDPlayer: dVD,projector: pro,}
}
func (h HomeTheater) watchMovie(movie string) {fmt.Println("准备好看电影……")h.amplifier.On()h.amplifier.setVolume(5)h.dVDPlayer.On()h.dVDPlayer.play(movie)h.projector.On()h.projector.wideScreenMode()
}
package facadeimport "testing"func TestFacade(t *testing.T) {amplifier := NewAmplifier()dvdplayer := NewDVDPlayer()projector := NewProjector()theater := NewHomeTheater(amplifier, dvdplayer, projector)theater.watchMovie("《盗梦空间》")
}

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

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

相关文章

数据驱动的生态系统架构:打造智能化管理与业务增长的未来战略

在当今的数字化经济中,数据已成为企业最具战略价值的资产。通过数据的分析与应用,企业不仅能够提高业务效率,还能通过构建数据驱动的生态系统架构,实现跨行业协作与技术创新,最终提升全球竞争力。2024年生态系统架构可…

SpringBoot Jar 包加密防止反编译实战

今天给大家分享一个 SpringBoot 程序 Jar 包加密的方式,通过代码加密可以实现无法反编译。 应用场景就是当需要把公司的产品部署到友方公司或者其他公司时,可以防止客户直接反编译出来源码,大大提升代码的安全性。 版本 springboot 2.6.8j…

Java后端编程语言进阶篇

第一章 函数式接口 函数式接口是Java 8中引入的一个新特性,只包含一个抽象方法的接口。 函数式接口可以使用Lambda表达式来实现,从而实现函数式编程的特性。 使用 FunctionalInterface标识接口是函数式接口,编译器才会检查接口是否符合函数…

Qt 实现自定义截图工具

目录 Qt 实现自定义截图工具实现效果图PrintScreen 类介绍PrintScreen 类的主要特性 逐步实现第一步:类定义第二步:初始化截图窗口第三步:处理鼠标事件第四步:计算截图区域第五步:捕获和保存图像 完整代码PrintScreen.…

《程序猿之设计模式实战 · 池化思想》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

LSS如何做深度和语义预测

get_cam_feats() 先来看看代码: def get_cam_feats(self, x):"""Return B x N x D x H/downsample x W/downsample x C"""B, N

解锁编程潜力,从掌握GitHub开始

目录: 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1)in关键词 2)star或fork数量去查找 3)awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

基于SSM的大学新生报到系统+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

VSCode创建C++项目和编译多文件

前言 在刚安装好VSCode后,我简单尝试了仅main.cpp单文件编译代码,没有问题,但是当我尝试多文件编译时,就出现了无法识别cpp文件。 内容 创建项目 首先点击左上角“文件”;在菜单中选择“打开文件夹”;在…

【Elasticsearch系列二】安装 Kibana

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ClickHouse 24.8 LTS 版本发布说明

本文字数:13885;估计阅读时间:35 分钟 作者:ClickHouse Team 本文在公众号【ClickHouseInc】首发 时间飞逝,又到了新版本发布的时刻! 发布概要 本次ClickHouse 24.8 版本包含了19个新功能🎁、18…

基于51单片机的16X16点阵显示屏proteus仿真

地址: https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

管家婆云辉煌手机端怎么连接蓝牙打印机?

管家婆云辉煌手机端可以连接蓝牙打印机,这样手机可以发送打印任务到蓝牙打印机,完成打印任务。具体的设置步骤如下: 一、首先完成手机和蓝牙打印机配对,打开蓝牙打印机后。手机开启蓝牙和定位服务 点击手机设置,进入手…

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM 文章目录 一、基本原理DE-SVM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DE-SVM 分类预测原理和流程 1. 差分进化优化算法(DE) 原理…

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署

【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【图像分类】【OnnxRuntime】【Python】VggNet模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONN…

走进低代码表单开发(一):可视化表单数据源设计

在前文,我们已对勤研低代码平台的报表功能做了详细介绍。接下来,让我们深入探究低代码开发中最为常用的表单设计功能。一个完整的应用是由众多表单组合而成的,所以高效的表单设计在开发过程中起着至关重要的作用。让我们一同了解勤研低代码开…

[网络]http/https的简单认识

文章目录 一. 什么是http二. http协议工作过程三. http协议格式1. 抓包工具fiddler2. http请求报文3. http响应报文 一. 什么是http HTTP (全称为 “超⽂本传输协议”) 是⼀种应⽤⾮常⼴泛的 应⽤层协议 HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议 HTTP 往…

FPGA实现串口升级及MultiBoot(四)MultiBoot简介

缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7 我们在正常升级的过程(只使用一个位流文件),假如:(1)因为干扰通信模块收到了一个错误位;(2)或者烧写进FLASH时…

《深度学习》—— 神经网络模型中的损失函数及正则化惩罚和梯度下降

文章目录 前言一、损失函数二、正则化惩罚三、梯度下降 前言 在神经网络中,损失函数、正则化惩罚和梯度下降是三个关键的概念,它们共同作用于网络的训练过程,以提升网络的性能和泛化能力。神经网络模型结构如下图所示: 在构建好一…