设计模式(结构型模式)外观模式

目录

    • 一、简介
    • 二、外观模式
      • 2.1、子系统
      • 2.2、外观类
      • 2.3、使用
    • 三、优点与缺点

一、简介

  外观模式(Facade Pattern)是一种结构型设计模式,提供了一个统一的接口,用于访问子系统中的一组接口。这个模式隐藏了子系统的复杂性,并为客户端提供了一个更简单的接口,使得客户端与子系统之间的通信更加简单和直接。

  外观模式的主要目的是降低系统的复杂性,为客户端提供一个更加简化的接口,使得客户端不需要了解系统的内部结构和实现细节,只需通过外观类进行操作即可。在外观模式中,通常有以下几个角色:

  • Facade(外观): 外观类是客户端访问子系统的入口。它将客户端的请求委派给子系统中的相应对象,协调子系统对象完成任务。

  • Subsystem(子系统): 子系统是具体的功能模块或者类群。它们实现了系统的各种功能,但是对于客户端来说,这些功能的实现细节是透明的。

  外观模式可以帮助解耦客户端和子系统之间的依赖关系,降低了客户端与子系统之间的耦合性,同时也提高了系统的可维护性和灵活性。通过提供一个简化的接口,外观模式使得系统更易于使用和理解。

二、外观模式

2.1、子系统

  当设计一个家庭影院系统时,可以使用外观模式来简化各个子系统(如投影仪、音响、灯光等)的操作

// 子系统:投影仪
public class Projector {public void on() {System.out.println("打开投影仪");}public void off() {System.out.println("关闭投影仪");}public void setInput(String input) {System.out.println("投影仪准备播放:" + input);}
}// 子系统:音响
class SoundSystem {public void on() {System.out.println("打开声音");}public void off() {System.out.println("关闭声音");}public void setVolume(int volume) {System.out.println("音量设置为: " + volume);}
}// 子系统:灯光
public class Lights {public void dim() {System.out.println("关闭灯光");}public void brighten() {System.out.println("打开灯光");}}

2.2、外观类

// 外观类:家庭影院外观
public class HomeTheaterFacade {private Projector projector;private SoundSystem soundSystem;private Lights lights;public HomeTheaterFacade(Projector projector, SoundSystem soundSystem, Lights lights) {this.projector = projector;this.soundSystem = soundSystem;this.lights = lights;}public void watchMovie(String movie) {System.out.println("准备看家庭影院...");lights.dim();projector.on();projector.setInput(movie);soundSystem.on();soundSystem.setVolume(16);}public void endMovie() {System.out.println("关闭家庭影院...");soundSystem.off();projector.off();lights.brighten();}
}

2.3、使用

// 测试类
public class FacadeHomeTheaterExample {public static void main(String[] args) {Projector projector = new Projector();SoundSystem soundSystem = new SoundSystem();Lights lights = new Lights();HomeTheaterFacade homeTheater = new HomeTheaterFacade(projector, soundSystem, lights);// 看电影homeTheater.watchMovie("战狼");// 结束电影homeTheater.endMovie();}
}

运行结果:

准备看家庭影院...
关闭灯光
打开投影仪
投影仪准备播放:战狼
打开声音
音量设置为: 16
关闭家庭影院...
关闭声音
关闭投影仪
打开灯光

  在这个示例中,Projector、SoundSystem、Lights 分别表示家庭影院的投影仪、音响和灯光,HomeTheaterFacade 是外观类。客户端通过调用外观类的方法来实现整个家庭影院系统的控制,而不需要直接与各个子系统进行交互。外观模式将各个子系统的操作封装起来,使得客户端更加简单地控制家庭影院。

三、优点与缺点

  外观模式是一种有用的设计模式,它有一些优点和缺点。

优点:

  • 简化接口: 外观模式为复杂系统提供了一个简单的接口,隐藏了系统的复杂性,使得客户端更容易使用系统。
  • 降低耦合性: 外观模式可以降低客户端与子系统之间的耦合度,因为客户端只需与外观类进行交互,而不需要直接与多个子系统交互。
  • 更好的封装性: 外观模式能够将系统的内部细节封装起来,避免暴露给客户端,提高了系统的安全性和可靠性。
  • 易于使用: 对于客户端来说,使用外观模式更加直观和易于理解,不需要了解系统的内部结构和实现细节。

缺点:

  • 不符合开闭原则: 在需要新增或修改子系统的功能时,可能需要修改外观类,这可能违反了开闭原则,导致外观类的修改。
  • 可能引入单点故障: 如果外观类出现问题,可能影响整个系统,因为外观类控制了整个子系统的访问。
  • 可能增加系统复杂性: 如果外观类设计不当,可能会导致外观类本身也变得复杂,难以维护和理解。

  总的来说,外观模式适合在需要简化客户端与复杂系统之间交互的场景下使用,但需要注意合理设计外观类,避免引入过度复杂性和耦合度。

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

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

相关文章

【问题解决】如何将一个服务器的docker迁移到另一个服务器

要将Docker容器从一台机器迁移到另一台机器,可以按照以下步骤操作: 在机器A上提交容器为镜像: 使用docker commit命令将运行中的容器保存为新的镜像。这里需要容器的ID或名称,以及你想要命名的目标镜像名。 docker commit [容器…

车载电子电器架构 —— IP地址获取策略

车载电子电器架构 —— IP地址获取策略 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

【UE 材质】球形遮罩材质

效果 步骤 1. 新建一个材质,这里命名为“M_Mask” 打开“M_Mask”,混合模式设置为已遮罩,勾选双面显示 在材质图表中添加如下节点 此时我们将一个物体赋予材质“M_Mask”并放置在世界坐标原点,可以看到如下效果 2. 如果我们希望能…

Spring Boot中异步线程池@Async

很多业务场景需要使用异步去完成,比如:发送短信通知。要完成异步操作一般有两种: 1、消息队列MQ 2、线程池处理。 我们来看看Spring框架中如何去使用线程池来完成异步操作,以及分析背后的原理。 一. Spring异步线程池的接口类 …

【激光SLAM】里程计运动模型及标定

目录 里程计模型两轮差分底盘的运动学模型优点差分模型 三轮全向底盘的运动学模型优点全向模型 航迹推算(Dead Reckoning) 里程计标定线性最小二乘的基本原理最小二乘的直线拟合最小二乘在里程计标定中的应用方法 里程计模型 里程计相关介绍 两轮差分底盘的运动学模型 优点 …

无向图-树的重心-DFS求解

思路: 本题的本质是树的dfs, 每次dfs可以确定以u为重心的最大连通块的节点数,并且更新一下ans。 也就是说,dfs并不直接返回答案,而是在每次更新中迭代一次答案。 这样的套路会经常用到,在 树的dfs 题目中…

2024年MacBook上实用软件

Mac软件-mac软件下载-mac软件大全-MacZMacz下载是一个专业的Mac苹果电脑软件下载网站,提供专业的Mac软件、Mac游戏、精品插件以及各类海量素材下载,mac下载网站有Mac平台上常用好用的软件,有时下热门好玩的Mac游戏,还有各类PS、AE…

js去掉数组中的undefined及空字符串、null

方法一、filter函数 var arr [原数组]var newArr arr.filter(item > item && item.trim())console.log(newArr)例子: 可以使用JavaScript的filter()函数来过滤掉数组中的undefined元素。 const arr [1, undefined, hello, null, true];const filter…

CentOS 7中搭建NFS文件共享服务器的完整步骤

CentOS 7中搭建NFS文件共享服务器的完整步骤 要求:实现镜像文件共享,并基于挂载的共享目录配置yum源。 系统环境: 服务器:172.20.26.167-CentOS7.6 客户端:172.20.26.198-CentOS7.6 1、在服务器和客户端上&#x…

从奥迪Quattro到碧然德:揭秘技术品牌成功打造与推广的秘诀

在当前全球化和信息化快速发展的背景下,技术品牌的打造不仅是企业竞争力提升的重要途径,也是企业实现长远发展的基石。通过深入剖析,我们认识到,技术品牌的建设并非一蹴而就的过程,而是需要企业准确把握市场趋势&#…

Spring Boot + flowable 快速实现工作流

背景 使用flowable自带的flowable-ui制作流程图 使用springboot开发流程使用的接口完成流程的业务功能 文章来源:https://blog.csdn.net/zhan107876/article/details/120815560 一、flowable-ui部署运行 flowable-6.6.0 运行 官方demo 参考文档: htt…

编程笔记 html5cssjs 071 JavaScript Symbol 数据类型

编程笔记 html5&css&js 071 JavaScript Symbol 数据类型 一、Symbol 数据类型二、 示例小结 在JavaScript中,Symbol 是一种基本数据类型,它于 ECMAScript 6(ES6)中引入,用来创建唯一的、不可变的值。这些值可以…

【QT+QGIS跨平台编译】之二十九:【HDF5+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、HDF5介绍二、文件下载三、文件分析四、pro文件一、HDF5介绍 HDF5(层次数据格式第5版)是一种用于存储和组织大量数据的文件格式和技术集合。它由美国国家超级计算应用中心(NCSA)开发,旨在解决复杂数据的存储和分布问题。HDF5支持各种数据类型,能够有效地存储…

24种设计模式之行为型模式(下)-Java版

软件设计模式是前辈们代码设计经验的总结,可以反复使用。设计模式共分为3大类,创建者模式(6种)、结构型模式(7种)、行为型模式(11种),一共24种设计模式,软件设计一般需要满足7大基本原则。下面通过5章的学习一起来看看设计模式的魅…

大端和小端模式介绍

介绍 “大端”和“小端”通常指的是字节序(Byte Order)的两种类型,也被称为端序(Endianness)。在多字节的数据类型(如整数)中,字节可以以不同的顺序存储,这影响了计算机…

风行智能电视G32Y 强制刷机升级方法,附刷机升级数据MstarUpgrade.bin

升级步骤: 1、下载刷机数据,如是压缩包,需要先解压,然后将刷机bin格式的文件重命名为MstarUpgrade.bin 2、将此文件放到U盘根目录 (U盘格式FAT32,单分区,建议4G的优盘刷机成功率高)…

JD京东商品详情数据获取API测试示例

item_get 获得JD商品详情item_search 按关键字搜索商品item_search_img 按图搜索京东商品(拍立淘)item_search_shop 获得店铺的所有商品item_history_price 获取商品历史价格信息item_recommend 获取推荐商品列表buyer_order_list 获取购买到的商品订单列…

彻底学会系列:一、机器学习之线性回归(一)

1.基本概念(basic concept) 线性回归: 有监督学习的一种算法。主要关注多个因变量和一个目标变量之间的关系。 因变量: 影响目标变量的因素: X 1 , X 2 . . . X_1, X_2... X1​,X2​... ,连续值或离散值。 目标变量: …

JAVA毕业设计126—基于Java+Springboot+Vue的二手交易商城管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的二手交易商城管理系统(源代码数据库)126 一、系统介绍 本项目前后端分离,本系统分为管理员、用户两种角色 1、用户: 注册、登录、…

docker更换镜像源

添加的镜像源 {"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com", "https://reg-mirror.qiniu.com/", "https://docker.mirrors.ustc.edu.cn"] }docker更换镜像源之后一定要重启守卫 systemctl daemon-reloaddock…