设计模式浅析(八) ·外观模式

设计模式浅析(八) ·外观模式

日常叨逼叨

java设计模式浅析,如果觉得对你有帮助,记得一键三连,谢谢各位观众老爷😁😁


外观模式

概念

外观模式(Facade Pattern)是一种设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。这种设计模式的主要目的是降低系统的复杂性,简化客户端与子系统之间的交互。

外观(Facade)模式是“迪米特法则”的典型应用。

迪米特法则:又叫作最少知识原则(The Least Knowledge Principle),一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解,只和朋友通信,不和陌生人说话。英文简写为: LOD。

组成
  1. 外观类(Facade):这是外观模式的核心。外观类为客户端提供了一个简洁的接口,用于访问子系统中的功能。外观类内部通常包含了对子系统多个组件的引用,并且提供了高层次的方法来调用这些组件。客户端不需要直接与子系统组件交互,而是通过外观类来间接访问它们。
  2. 子系统组件(Subsystem Components):这些是子系统中实际执行操作的类。它们实现了具体的功能,但通常对于客户端来说是不可见的。外观类负责协调这些组件的工作,并将结果呈现给客户端。
  3. 客户端(Client):客户端是使用外观模式的代码部分。它只需要与外观类交互,而不需要了解子系统的具体实现细节。客户端通过调用外观类提供的方法,可以间接地使用子系统提供的功能。

案例

我就以自己家里的一些家电为例子,比如我家有电灯,空调,电视这三种家电,然后呢他们都有自己独立的开关,我如果我想要让它们都处于工作状态,我得一件一件地去打开他们的开关,但是呢,我个人比较懒,想着能不能接入一个小雷同学,让它去负责各个家电,我只需要操作小雷同学就可以?

说干就干,首先是我家里的各个电器

//空调
public class AirCondition {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 Light {public void on() {System.out.println("打开了灯....");}public void off() {System.out.println("关闭了灯....");}
}

然后呢,我接入一个小雷同学

//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;//other household appliancepublic SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("开灯")) {onLamp();} else if (message.contains("关灯")) {offLamp();} else if (message.contains("开电视")) {onTV();} else if (message.contains("关电视")) {offTV();} else if (message.contains("开空调")) {onAirCondition();} else if (message.contains("关空调")) {offAirCondition();} else if (message.contains("打开家电")) {onLamp();onTV();onAirCondition();//on other household appliance} else if (message.contains("关闭家电")) {offLamp();offTV();offAirCondition();//off other household appliance} else {System.out.println("我还听不懂你说的!!!");}}private void onLamp() {light.on();}private void offLamp() {light.off();}private void onTV() {tv.on();}private void offTV() {tv.off();}private void onAirCondition() {airCondition.on();}private void offAirCondition() {airCondition.off();}
}

而对于我来说,我只需要知道小雷同学,而不需要知道各个家电。

public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("小雷同学,请打开家电");
//        facade.say("关闭家电");}
}

执行结果:

打开了灯…
打开了电视…
打开了空调…

这样,对于客户端来说,可以通过一个智能音箱控制全部,而不用管其他的具体实现,只要知道这个接口即可以了。

但是在一些具体的示例中,外观模式的使用可能有所差异,望各位看官老爷们斟酌使用。

优缺点

外观模式的主要优点包括:

  • 简化了客户端的使用:客户端只需要与外观类交互,而不需要了解子系统的复杂性。
  • 降低了系统的耦合度:外观类将客户端与子系统解耦,减少了它们之间的直接依赖。
  • 提供了统一的接口:外观类为子系统提供了一个统一的接口,使得子系统更加容易集成和扩展。

然而,外观模式也有一些潜在的缺点,比如:

  • 过度集中化:如果外观类承担了太多的责任,它可能会变得过于复杂和难以维护。
  • 不适合所有场景:对于某些系统来说,外观模式可能并不是最合适的设计选择。如果子系统非常简单,或者客户端需要直接访问子系统组件,那么外观模式可能并不适用。

代码相关代码可以参考 代码仓库🌐

ps:本文原创,转载请注明出处


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

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

相关文章

深度学习发展里程碑事件2006-2024

2006-2024年,深度学习发展经历众多的里程碑事件,一次次地刺激着人们的神经,带来巨大的兴奋。电影还在继续,好戏在后面,期待…… 2006年 深度信念网络(DBNs):Geoffrey Hinton与他的学…

备战蓝桥杯 Day10(背包dp)

01背包问题 1267:【例9.11】01背包问题 【题目描述】 一个旅行者有一个最多能装 M� 公斤的背包,现在有 n� 件物品,它们的重量分别是W1,W2,...,Wn�1,�2&#…

蓝桥杯刷题--python-10(2023填空题3)

0工作时长 - 蓝桥云课 (lanqiao.cn) import datetime time_str_list=[] while(True):tmp=input()if not tmp: breaktime_str_list.append(tmp)# time_list=[datetime.datetime.strptime(t,"%Y-%m-%d %H:%M:%S")for t in time_str_list] time_list.sort() sum=0 for i…

【代码随想录算法训练营Day25】● 216.组合总和III ● 17.电话号码的字母组合

文章目录 Day 25 第七章 回溯算法part02216.组合总和III自己的思路(✅通过) 17.电话号码的字母组合思路代码 Day 25 第七章 回溯算法part02 今日内容: ● 216.组合总和III● 17.电话号码的字母组合 216.组合总和III 如果把 组合问题理解了…

计算机组成原理(9)----硬布线控制器

控制单元CU若想发出对应的控制信号,则需要以下信息:指令操作码,目前的机器周期,节拍信号,机器状态条件,根据这些信息,CU就能确定在这个节拍下应该发出哪些"微命令",也就是…

SQL注入:使用预编译防御SQL注入时产生的问题

目录 前言 模拟预编译 真正的预编译 预编译中存在的SQL注入 宽字节 没有进行参数绑定 无法预编译的位置 前言 相信学习过SQL注入的小伙伴都知道防御SQL注入最好的方法,就是使用预编译也就是PDO是可以非常好的防御SQL注入的,但是如果错误的设置了…

计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

从零学算法238

238.给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复…

Python自动化UI测试之Selenium基础实操

1. Selenium简介 Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的,可以直接运行在浏览器上,支持的浏览器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl…

SVN忽略已提交的文件(ignore,移出版本控制)

本文适用于已安装TortoiseSVN客户端的同学。 1、右键点击要忽略的文件夹或文件,鼠标移到“TortoiseSVN”,找到“Unversion and add to ignore list”,选择文件夹,弹出提示框确认忽略。 2、设置完忽略文件后,还需要做…

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型

多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型 目录 多维时序 | Matlab实现GRU-MATT门控循环单元融合多头注意力多变量时间序列预测模型预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.多维时序 | Matlab实现GRU-MATT门控循环单元融…

【Maven】介绍、下载及安装、集成IDEA

目录 一、什么是Maven Maven的作用 Maven模型 Maven仓库 二、下载及安装 三、IDEA集成Maven 1、POM配置详解 2、配置Maven环境 局部配置 全局设置 四、创建Maven项目 五、Maven坐标详解 六、导入Maven项目 方式1:使用Maven面板,快速导入项目 …

React Native框架开发介绍,以及其优点

大家好,我是咕噜铁蛋,在今天的文章中,我通过科技手段和大家一起探讨一下React Native框架的开发介绍以及其优点。我深知选择合适的开发工具对于项目的成功至关重要。而React Native作为一款流行的跨平台移动应用开发框架,其独特之…

Linux并发与竞争的基本概念

一. 简介 Linux是一个多任务操作系统,肯定会存在多个任务共同操作同一段内存或者设备的情况, 多个任务甚至中断都能访问的资源叫做共享资源,在驱动开发中要注意对共享资源的保护,也就是要处理对共享资源的并发访问。比如&#xf…

【服务器数据恢复】FreeNAS+ESXi虚拟机数据恢复案例

服务器数据恢复环境: 一台服务器通过FreeNAS(本案例使用的是UFS2文件系统)实现iSCSI存储,整个UFS2文件系统作为一个文件挂载到ESXi虚拟化系统(安装在另外2台服务器上)上。该虚拟化系统一共有5台虚拟机&…

2024水科技大会暨技术装备成果展览会——高品质供水和饮用水水源安全保障论坛

供水与饮水安全直接关系到人民群众的生活与健康,切实做好城市供水与饮水安全保障工作,是把以人为本真正落到实处的一项紧迫任务。近年来,中央和地方加大了城乡供水与饮水安全保障工作的力度,对标最优质供水城市建设要求&#xff0…

[Angular 基础] - service 服务

[Angular 基础] - service 服务 之前的笔记就列举三个好了……没想到 Angular 东西这么多(ー ー;)……全加感觉越来越凑字数了 [Angular 基础] - 视图封装 & 局部引用 & 父子组件中内容传递 [Angular 基础] - 生命周期函数 [Angular 基础] - 自…

请简述你对SpringMVC的理解

SpringMVC是一种基于Java语言开发,实现了WebMVC设计模式,请求驱动类型 的轻量级Web框架。 采用了MVC架构模式的思想,通过把Model,View,Controller分离,将Web层进 行职责解耦,从而把复杂的Web应…

idea打开项目白屏

解决方法: 右键“最大化” idea打开项目白板解决方案_idea打开白屏-CSDN博客 IDEA 2022 CPU占用100%的问题及解决方法_java_脚本之家

STM32控制数码管从0显示到99

首先 先画电路图吧!打开proteus,导入相关器件,绘制电路图。如下:(记得要保存啊!发现模拟一遍程序就自动退出了,有bug,我是解决不了,所以就是要及时保存,自己重…