九、外观模式

外观模式(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,一经查实,立即删除!

相关文章

【Android】【Bug】Activity全屏(保留底部按钮)被打断变成非全屏了

问题 在Activity里面设置全屏显示(保留底部按钮的全屏),刚开始的时候显示的也是全屏,但是在此页面进行一些操作之后,全屏变成非全屏了。 全屏设置方法 在 Activity 中的 onCreate 方法里,添加以下代码: Override p…

微信文件处理与命名机制分析(基于微信 8.0.50 版本)

微信文件处理与命名机制分析(基于微信 8.0.50 版本) 摘要 微信作为一款广泛使用的即时通讯工具,涉及图片、视频、文档等多种文件类型的传输与管理。本文基于微信 8.0.50 版本,探讨其对于图片、GIF、视频等文件的命名处理策略&am…

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

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

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

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

RuoYi 开源框架,集成了后端管理,后端java版 App 移动解决方案

文章目录 前言一、后端:二、后台管理三、App 移动总结 前言 后端: 后台管理: 使用的前端技术Vue、Element后端SpringBoot & Security完全分离的权限管理系统。 App 移动解决方案:采用uniapp框架 提示:以下是本篇文…

Java后端编程语言进阶篇

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

Qt 实现自定义截图工具

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

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

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

“xi” 和 “dbscan” 在OPTICS聚类中是什么意思

在 OPTICS(Ordering Points To Identify the Clustering Structure) 聚类算法中,xi 和 dbscan 是两种不同的聚类提取方法,它们用于从OPTICS算法生成的排序数据中提取最终的聚类结构。具体解释如下: dbscan 方法: 该方法…

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

PHP函数如何传递数组参数

php 函数可以使用数组参数传递大量数据。语法:参数类型前加上方括号 ([])。例如:myfunction(array $arr)。实战案例:计算数组元素平均值。注意:数组参数默认为引用传递,类型提示可提高代码可读性,数组解构可…

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

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

OpenSSL工具验证RSA证书

openssl x509 是一个用于处理 X.509 证书的命令行工具。常用的 openssl x509 命令&#xff1a; -in <file>&#xff1a;指定输入文件。-out <file>&#xff1a;指定输出文件。-noout&#xff1a;不输出证书信息。-text&#xff1a;以文本格式输出证书信息。-pubke…

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

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

关于RabbitMQ消息丢失的解决方案

RabbitMQ如何保证消息的可靠性传输 一、消息丢失的原因 1. 生产者端 网络问题&#xff1a; 原因&#xff1a;生产者与RabbitMQ服务器之间的网络连接不稳定或中断&#xff0c;导致消息在传输过程中丢失。解决方案&#xff1a;确保网络连接稳定&#xff0c;监控网络状态&#x…

springboot后端开发-常见注解及其用途

文章目录 1. 组件注解2. 依赖注入注解3. 配置类注解4. 测试注解5. 控制器注解6. 安全和认证注解7. 切面相关注解8. API文档相关注解(需引入swagger)9. 其他注解 在Spring Boot框架中&#xff0c;有许多常用的注解用来简化开发过程中的依赖注入、组件扫描、配置、安全控制等方面…

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

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

软件测试工程师面试整理-数据库与SQL

在软件测试过程中,数据库和SQL的知识是非常重要的,尤其是在涉及数据密集型应用或需要验证数据准确性的场景中。测试人员需要掌握SQL语句,以便查询、插入、更新和删除数据,并验证数据库操作的正确性。 1. 数据库基础知识 ● 关系型数据库:大多数应用使用关系型数据库(如My…

Qt什么时候触发paintEvent事件

‌paintEvent事件可以在以下几种情况下被触发‌&#xff1a; ‌窗口初始化和显示‌&#xff1a;当窗口首次被创建、显示&#xff0c;或者窗口被覆盖、最小化后再恢复时&#xff0c;paintEvent会被触发以绘制窗口的内容。‌部件大小或位置变化‌&#xff1a;如果窗口或部件的大…

【Elasticsearch系列二】安装 Kibana

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