当前位置: 首页 > news >正文

Java设计模式 —— 【结构型模式】外观模式详解

文章目录

  • 概述
  • 结构
  • 案例实现
  • 优缺点


概述

外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

举个例子,在没有只能家居的时候,我们开灯,开空调,开电视等等一系列操作,都需要我们一件一件来完成;在有了智能家居以后,在智慧生活设定指定的程序,就可以实现一键开启指定的家居。
在这里插入图片描述


结构

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色: 为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色: 实现系统的部分功能,客户可以通过外观角色访问它。
    在这里插入图片描述

案例实现

以我们熟知的智能家居为例:

智能音箱就相当于我们的外观类,而家居就相当于一个一个的系统,只需要操作智能音箱就可以实现所有家电的开关。
在这里插入图片描述

子系统【电灯、电视、空调】:

//电灯类
public class Light {public void on() {System.out.println("打开电灯....");}public void off() {System.out.println("关闭电灯....");}
}//电视类
public class TV {public void on() {System.out.println("打开电视....");}public void off() {System.out.println("关闭电视....");}
}//空调类
public class AirCondition {public void on() {System.out.println("打开空调....");}public void off() {System.out.println("关闭空调....");}
}

外观类【智能音箱】:

//智能音箱类
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if(message.contains("打开")) {on();} else if(message.contains("关闭")) {off();} else {System.out.println("我还听不懂你说的!!!");}}//一键开电器private void on() {light.on();tv.on();airCondition.on();}//一键关电器private void off() {light.off();tv.off();airCondition.off();}
}

测试:

public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("打开");System.out.println("================");facade.say("关闭");}
}

在这里插入图片描述


优缺点

优点:

  • 简化了调用过程,无需了解深入子系统,防止带来风险;
  • 减少系统依赖、松散耦合,外观模式讲客户端和子系统之间进行解耦;
  • 更好的划分访问层次;
  • 符合迪米特法则,即最少知道原则。

缺点:

  • 增加子系统、扩展子系统行为容易引入风险;
  • 不符合开闭原则,如果需要新增或者修改子系统的功能,可能需要修改外观类。

相关文章:

Java设计模式 —— 【结构型模式】外观模式详解

文章目录 概述结构案例实现优缺点 概述 外观模式又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这…...

线性表实验

实验目的与要求 实验目的: 线性表的逻辑结构特点和线性表抽象数据类型的描述方法线性表的两类存储结构设计方法以及各自的优缺点掌握线性表的基本知识深入理解、掌握并灵活运用线性表。熟练掌握线性表的存储结构及主要运算的实现掌握栈的定义、栈的逻辑结构特性和…...

003无重复字符的最长子串

(https://i-blog.csdnimg.cn/direct/352cc4217764458f9a1510c62f89a91e.png)(https://i-blog.csdnimg.cn/direct/14239305bb5a4d068f323de7afc14086.png)...

记录--uniapp 安卓端实现录音功能,保存为amr/mp3文件

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 功能实现需要用到MediaRecorder、navigator.mediaDevices.getUserMedia、Blob等API,uniapp App端不支持,需要借助renderjs来实现 实现逻辑 通过naviga…...

前端生成docx文档、excel表格、图片、pdf文件

一、前端将页面某区域内容下载为word文档&#xff1a;html-to-docx、file-saver插件组合使用 import HTMLtoDOCX from html-to-docx; import { saveAs } from file-saver;const exportTest async () > {const fileBuffer await HTMLtoDOCX(<h2>文件标题</h2>&…...

c++---------流类

格式化输入&#xff08;cin的格式化&#xff09; 基本用法与控制符 在C中&#xff0c;std::cin用于从标准输入&#xff08;通常是键盘&#xff09;读取数据。它默认以空白字符&#xff08;空格、制表符、换行符&#xff09;为分隔符来读取不同的数据。例如&#xff0c;读取两个…...

3、基本复用原理和复用单元

基本复用原理 字节间插复用&#xff1a; SDH 采用字节间插复用方式来构建更高等级的信号。这是一种将低速率信号按字节为单位依次插入到高速率信号帧结构中的复用方法。例如&#xff0c;将多个 STM - 1 信号复用成 STM - 4 信号时&#xff0c;是把 4 个 STM - 1 信号的字节依次…...

Vue与React:前端框架的巅峰对决

文章目录 一、引言&#xff08;一&#xff09;前端框架发展现状简述 二、Vue 与 React 框架概述&#xff08;一&#xff09;Vue.js 简介&#xff08;二&#xff09;React.js 简介 三、开发效率对比&#xff08;一&#xff09;Vue 开发效率分析&#xff08;二&#xff09;React …...

Java 中的面向对象编程 (OOP) 概念

引言 面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种编程范式&#xff0c;它通过将数据和操作封装在一起&#xff0c;形成一个称为“对象”的实体来组织代码。Java 是一种完全支持 OOP 的语言&#xff0c;广泛应用于企业级应用开发。本文将深入…...

十二月第20讲:Python中指数概率分布函数的绘图详解

一、指数分布的理论概述 1. 定义与公式 指数分布是一种描述随机变量在一个固定底数上的对数值的分布情况&#xff0c;或者在概率理论和统计学中&#xff0c;用于描述泊松过程中事件之间的时间间隔的概率分布。具体来说&#xff0c;它表示事件以恒定平均速率连续且独立地发生的…...

汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片

概述: 杰发科技自成立以来,一直专注于汽车电子芯片及相关系统的研发与设计。 产品布局: 合作伙伴: 杰发科技不断提升产品设计能力和产品工艺,确保产品达 到更高的质量标准。目前杰发科技已通过ISO9001质 量管理体系与CMMIL3认证。 杰发科技长期合作的供应商(芯片代工厂、…...

【py脚本+logstash+es实现自动化检测工具】

概述 有时候&#xff0c;我们会遇到需要查看服务器的网络连接或者内存或者其他指标是否有超时&#xff0c;但是每次需要登录到服务器查看会很不方便,所以我们可以设置一个自动脚本化工具自动帮助我们查看&#xff0c;下面我做了一个demo在windows上面。 一、py脚本 import s…...

Zookeeper的选举机制

Zookeeper的leader选举机制是基于ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;协议的&#xff0c;这是一种基于Paxos协议的变种&#xff0c;专门用于Zookeeper的分布式协调服务。 选举过程主要分为以下几个阶段&#xff1a; 1.初始化阶段 当一个新的Zookeeper服…...

2024-05-18 前端模块化开发——ESModule模块化

目录 1、认识 ES Module2、ES Module基本使用3、export关键字 3.1、导出方式一——直接导出3.2、导出方式二——通过as起别名3.3、导出方式三——定义的时候就直接导出 4、import关键字 4.1、导入方式一——直接导入4.2、导入方式二——通过as起别名4.3、导入方式三——可以给…...

Linux IPV6 地址配置 | IPv6 禁用 | ping6 过程细节剖析 | IPv6 排障

注&#xff1a; 本文为 “Linux IPV6 地址配置 | IPv6 禁用 | ping6 过程细节剖析 | IPv6 排障” 相关文章合辑。 Linux 服务器设备上配置 IPV6 地址方法 aischang 于 2018-08-25 12:56:25 发布 1. 手动执行命令配置&#xff1a; ifconfig em1 inet6 add 8888::a7/96 up2. 删…...

【YashanDB知识库】XMLAGG方法的兼容

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802943.html?templateId1718516 【关键字】 XMLAGG方法的兼容 【问题描述】 崖山数据库不支持将XMLAGG相关的函数内容&#xff0c;需要替换成支持的功能函数WM_CONCAT(T.COLUMN_NAME…...

echarts加载区域地图,并标注点

效果如下&#xff0c;加载了南海区域的地图&#xff0c;并标注几个气象站点&#xff1b; 1、下载区域地图的JSON&#xff1a;DataV.GeoAtlas地理小工具系列 新建nanhai.json&#xff0c;把下载的JSON数据放进来 说明&#xff1a;如果第二步不打勾&#xff0c;只显示省的名字&a…...

echarts画风向杆

1.安装echarts 2.引入echarts 4.获取数据&#xff0c;转换数据格式 windProfile.title.text ${moment(time.searchTime[0], ‘YYYY-MM-DD HH:mm:ss’).format( ‘YYYY-MM-DD HH:mm’ )}-${moment(time.searchTime[1], ‘YYYY-MM-DD HH:mm:ss’).format(‘YYYY-MM-DD HH:mm’)…...

【LeetCode每日一题】LeetCode 345.反转字符串中的元音字母

LeetCode 345.反转字符串中的元音字母 题目描述 给定一个字符串 s&#xff0c;你需要反转字符串中所有的元音字母&#xff0c;并返回新的字符串。 元音字母是 a, e, i, o, u&#xff0c;这些字母的大小写都会被考虑。 示例 1: 输入: s "hello" 输出: "holle…...

蓝桥杯练习生第四天

小蓝每天都锻炼身体。 正常情况下&#xff0c;小蓝每天跑 11 千米。如果某天是周一或者月初&#xff08;11 日&#xff09;&#xff0c;为了激励自己&#xff0c;小蓝要跑 22 千米。如果同时是周一或月初&#xff0c;小蓝也是跑 22 千米。 小蓝跑步已经坚持了很长时间&#x…...

PT-Plugin-Plus:PT站点下载助手安装与使用指南

PT-Plugin-Plus&#xff1a;PT站点下载助手安装与使用指南 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 项目地址: h…...

MoveIt 2 Launch文件进阶:如何用MoveItConfigsBuilder灵活切换规划器(OMPL vs. Pilz)

MoveIt 2规划器切换实战&#xff1a;用MoveItConfigsBuilder实现OMPL与Pilz工业规划器的动态选择 在工业机器人应用开发中&#xff0c;运动规划器的选择往往决定了任务执行的效率和质量。想象一下这样的场景&#xff1a;你的机械臂需要在杂乱环境中快速避障移动时&#xff0c;…...

企业级流程建模前端架构:基于Vite+Vue3的低代码解决方案

企业级流程建模前端架构&#xff1a;基于ViteVue3的低代码解决方案 【免费下载链接】vite-vue-bpmn-process 基于 Vite TypeScript Vue3 NaiveUI Bpmn.js 的流程编辑器&#xff08;前端部分&#xff09;。支持高度自定义&#x1f680;&#x1f680;&#x1f680;。Vue 2 版本…...

快马平台快速原型:十分钟用AI生成你的第一个龙虾养殖系统Docker部署方案

最近在研究如何用Docker快速搭建一个龙虾养殖模拟系统&#xff0c;发现用InsCode(快马)平台可以大大简化这个过程。作为一个快速原型验证工具&#xff0c;它让我在十分钟内就完成了从构思到部署的全流程。下面分享下我的实践心得&#xff1a; 项目构思阶段 这个模拟系统需要展示…...

目标检测实战:从VOC XML到YOLO格式的自动化数据流水线

1. 为什么需要VOC转YOLO格式 在目标检测任务中&#xff0c;数据格式的统一性直接影响着模型训练的效率。VOC&#xff08;PASCAL VOC&#xff09;和YOLO是两种最常见的标注格式&#xff0c;但它们的存储方式截然不同。VOC采用XML文件记录目标的类别和边界框坐标&#xff0c;而YO…...

Spring PetClinic实战解析:从单体应用到云原生部署的5大架构亮点

Spring PetClinic实战解析&#xff1a;从单体应用到云原生部署的5大架构亮点 【免费下载链接】spring-petclinic A sample Spring-based application 项目地址: https://gitcode.com/gh_mirrors/sp/spring-petclinic 你是否遇到过这样的困境&#xff1a;在学习Spring框架…...

WebGLInput:重构Unity WebGL输入体验的革命性方案

WebGLInput&#xff1a;重构Unity WebGL输入体验的革命性方案 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 在Unity WebGL开发中&#xff0c;输入法支持一直是开发者面临的核心挑战之一。WebGLInput项目通…...

WebSocket代理避坑指南:Nginx中proxy_set_header的3个关键配置项

WebSocket代理实战&#xff1a;Nginx中proxy_set_header的3个黄金法则 当在线聊天室的用户突然集体掉线&#xff0c;或是实时协作文档频繁失去同步时&#xff0c;问题往往藏在那些容易被忽视的HTTP头信息里。WebSocket作为现代实时应用的血管&#xff0c;其代理配置的精细程度直…...

STM32博物馆环境监控系统设计与实现

基于STM32的博物馆展柜环境监控系统设计1. 项目概述1.1 系统背景文物保护工作中&#xff0c;展柜微环境稳定性直接影响文物保存状态。传统人工巡检方式存在响应滞后、数据不连续等问题。本项目设计了一套基于STM32的智能化环境监控系统&#xff0c;可实时监测温湿度、光照、烟雾…...

Mac上PPT讲稿一键变文稿:用AppleScript自动化导出备注到TXT(附完整代码)

Mac上PPT讲稿一键变文稿&#xff1a;用AppleScript自动化导出备注到TXT&#xff08;附完整代码&#xff09; 每次做完PPT&#xff0c;看着密密麻麻的备注栏&#xff0c;你是不是也头疼怎么把这些零散的讲稿整理成连贯的文档&#xff1f;作为一位经常需要准备培训材料的讲师&…...