掌握设计模式--外观模式

news/2025/1/10 14:50:54/文章来源:https://www.cnblogs.com/dennyLee2025/p/18656375

外观模式

外观模式 (Facade Pattern) ,又称为门面模式,是一种结构型设计模式,它通过为一组复杂的子系统提供一个简化的接口,使得客户端可以更容易地访问和使用这些子系统的功能。外观模式隐藏了系统的复杂性,对外提供了一个简单的接口,从而减少了外部系统与子系统之间的依赖关系,提高了系统的可维护性和可扩展性。比如,一个操作系统中有多个复杂的子系统,操作系统的应用与操作系统的底层交互便是通过操作系统接口来实现,应用层的开发不可能直接操作各个子系统的实现,使用外观模式实现分层结构,这样隐藏复杂的底层逻辑的同时简化应用层开发,大大降低耦合度

主要结构

  • 外观 (Facade):为一组复杂的子系统提供简化的接口。
  • 子系统 (Subsystem):实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。
  • 客户端 (Client):需要使用子系统功能的外部代码或模块。

案例实现

假设我们有一个子系统涉及多个模块,比如门禁控制、灯光控制和空调控制。使用外观模式,我们可以提供一个简化的接口来控制所有这些设备。

案例类图

image

子系统类

public class DoorSystem {public void openDoor() {System.out.println("--开门...");}public void closeDoor() {System.out.println("--关门...");}
}class LightSystem {public void turnOnLights() {System.out.println("--开灯...");}public void turnOffLights() {System.out.println("--关灯...");}
}class ACSystem {public void turnOnAC() {System.out.println("--打开空调...");}public void turnOffAC() {System.out.println("--关闭空调...");}
}

外观类

public class SmartHomeFacade {private DoorSystem doorSystem;private LightSystem lightSystem;private ACSystem acSystem;public SmartHomeFacade() {this.doorSystem = new DoorSystem();this.lightSystem = new LightSystem();this.acSystem = new ACSystem();}// 提供简化接口public void arriveHome() {doorSystem.openDoor();lightSystem.turnOnLights();acSystem.turnOnAC();}public void leaveHome() {lightSystem.turnOffLights();acSystem.turnOffAC();doorSystem.closeDoor();}
}

客户端测试

public class FacadeDemo {public static void main(String[] args) {SmartHomeFacade homeFacade = new SmartHomeFacade();// 当到家时,外观模式简化了操作System.out.println("当到家时:");homeFacade.arriveHome();// 当离家时,外观模式也简化了操作System.out.println("当离家时:");homeFacade.leaveHome();}
}

测试结果

当到家时:

--开门...

--开灯...

--打开空调...

当离家时:

--关灯...

--关闭空调...

--关门...

简单分析

子系统类DoorSystemLightSystemACSystem 是独立的模块,它们负责具体的功能。

外观类SmartHomeFacade 提供了一个简化的接口 (arriveHomeleaveHome),通过它,客户端可以简化与各个子系统的交互。

客户端代码:客户端通过 SmartHomeFacade 调用 arriveHomeleaveHome 方法来控制门、灯和空调。

通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。

优缺点和应用场景

优点

  1. 简化接口:客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。
  2. 减少依赖:客户端只依赖外观类,减少了与复杂子系统之间的耦合度。
  3. 提高系统的灵活性:外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。
  4. 易于使用:通过提供简单的接口,使得系统的使用更加直观,便于理解。

缺点

  1. 引入额外的层次:虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。
  2. 限制灵活性:外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。

应用场景

  • 复杂子系统的简化:当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。
  • 集成多个子系统:当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。
  • 需要解耦的场景:外观模式适用于减少客户端与子系统之间耦合度的场景。

总结

外观模式通过将复杂系统的实现细节隐藏起来,提供一个简单的接口,使得客户端代码更加简洁,降低了系统间的耦合度。这种模式非常适用于需要简化复杂子系统交互的场景。

image

需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。


超实用的SpringAOP实战之日志记录

2023年下半年软考考试重磅消息

通过软考后却领取不到实体证书?

计算机算法设计与分析(第5版)

Java全栈学习路线、学习资源和面试题一条龙

软考证书=职称证书?

软考中级--软件设计师毫无保留的备考分享

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

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

相关文章

Navicat 17 for Mac v17.1.5数据库管理软件

Navicat 17 for Mac v17.1.5数据库管理软件 Navicat Premium 17 for Mac是一款专业的数据库管理工具,适用于开发人员、数据库管理员和分析师等用户。它提供了强大的数据管理功能和丰富的工具,使用户能够轻松地管理和维护数据库,提高数据处理效率。 提供了无缝数据迁移功能;多…

Permute 媒体文件格式转换软件【音视频图像文件转换,简单操作,轻松转换,

Permute 媒体文件格式转换软件【音视频图像文件转换,简单操作,轻松转换, 简介 Permute是一款功能强大的媒体文件格式转换软件。支持多种音视频和图像格式,包括但不限于MP4、AVI、MOV、MKV、MP3、WAV、FLAC、JPEG、PNG等。操作界面简洁明了,只需拖拽文件或点击添加按钮来选…

搭建k8s集群

由于格式和图片解析问题,为了更好体验,可前往 阅读原文本文带着大家按照官方文档进行k8s搭建,环境是基于arm架构centos7.9的虚拟机环境进行的,如果你使用的是非ARM架构的系统,仍然可以参考文章指导,而涉及到的一些安装链接需要根据情况替换成兼容你自己系统的链接 本次安…

《深入理解Mybatis原理》MyBatis数据源与连接池详解

MyBatis数据源DataSource分类 MyBatis把数据源DataSource分为三种:UNPOOLED 不使用连接池的数据源 POOLED 使用连接池的数据源 JNDI 使用JNDI实现的数据源相应地,MyBatis内部分别定义了实现了java.sql.DataSource接口的UnpooledDataSource,PooledDataSource类来表示UNPOOLED…

C#/.NET/.NET Core优秀项目和框架2024年12月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS Dell (戴尔) 定制版

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Dell (戴尔) 定制版VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS Dell (戴尔) 定制版 ESXi 8.0U3c 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)…

读数据保护:工作负载的可恢复性30全托管式的数据保护服务

全托管式的数据保护服务1. 全托管式的数据保护服务 1.1. fully managed data protection service 1.2. 全托管式的服务提供商(fully managed service provider) 1.3. 托管服务提供商,简称MSP1.3.1. 备份并不是主要工作之外的次要工作,而是它唯一的任务1.3.2. MSP是最省心的方…

OpenVX用户内核与功能参数

用户内核 OpenVX支持客户端定义函数的概念,这些函数应作为节点,从图形内部或图形内部执行。这种模式的目的是: 1)进一步利用OpenVX平台内节点的独立操作。 2)允许在OpenVX的其他地方重用组件化功能。 3)将严格的验证要求正式化(即合同编程)。 如图2-6所示,要执行客户端…

推荐4书《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

ubuntu下使用宝塔计划任务检测apache是否停止

ubuntu下使用宝塔计划任务检测apache是否停止,如果停止则启动apache,如果没停止则正常返回。 首先再宝塔计划任务里面新建一个任务: 然后检测代码为:#!/bin/bash# 检查Apache服务状态 if systemctl status httpd &> /dev/null; thenecho "Apache is running.&q…

【vulnhub靶场】隐蔽的计划任务提权 Funbox1

1. 侦查1.1 收集目标网络信息:IP地址1.2 主动扫描:扫描IP地址段1.3 搜索目标网站 2. 初始访问2.1 有效账户:默认账户2.2 利用面向公众的应用2.3 有效账户:默认账户 3. 权限提升3.1 计划任务/作业:Cron靶场下载地址: https://www.vulnhub.com/entry/funbox-1,518/1. 侦查 …

Snmpwalk工具如何在Windows和Linux的使用方法

一、什么是SNMP协议 SNMP(简单网络管理协议),顾名思义是一种网络管理的协议。SNMP是网络设备一个日常网络运维同行经常接触到的一个协议,不管是设备硬件系统的监控还是软件发出的告警,通通都能通过SNMP协议进行监控。SNMP总共有三个版本可以选择,通常选择的版本为v2c,因为…