结构型设计模式。持续更新

结构型 - 外观

提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。

public class SubSystem {public void turnOnTV() {System.out.println("turnOnTV()");}public void setCD(String cd) {System.out.println("setCD( " + cd + " )");}public void starWatching(){System.out.println("starWatching()");}
}
public class Facade {private SubSystem subSystem = new SubSystem();public void watchMovie() {subSystem.turnOnTV();subSystem.setCD("a movie");subSystem.starWatching();}
}public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.watchMovie();}
}
使用的场景? 
简化复杂系统:当系统内部由多个子系统组成,并且这些子系统之间相互依赖,外观模式可以提供一个统一的入口,简化使用。
解耦客户端和子系统:当客户端需要与多个子系统交互时,使用外观模式可以减少客户端对子系统的直接依赖,降低耦合度。
隐藏实现细节:当系统内部的实现经常变化,而希望客户端代码尽量少受影响时,可以使用外观模式隐藏这些变化。
提供统一接口:对外暴露一个简单、稳定的接口,避免让用户直接面对复杂的底层系统本质是什么?
外观模式的本质是 封装复杂性,提供统一访问接口。它通过创建一个“门面”(Facade)类,封装多个子系统的调用,使得客户端可以通过这个门面类来访问系统,而不需要了解系统的复杂内部结构。它解决了什么问题?
外观模式主要解决 降低复杂系统的使用难度和客户端的依赖性。
降低耦合:客户端不需要直接依赖多个子系统,而是通过外观类进行交互。
提高可维护性:当子系统发生变化时,只需要修改外观类,而不需要修改所有使用子系统的代码。
增强可读性:提供一个统一的、高层次的接口,使得代码更清晰、更易理解。它体现了设计模式中什么原则?
迪米特法则(最少知道原则,LoD):外观模式减少了对象之间的直接交互,客户端只需要知道外观类,而不需要了解具体的子系统。
单一职责原则(SRP):外观类的职责是提供一个简化的接口,而不是处理子系统的业务逻辑。
依赖倒置原则(DIP):高层模块(客户端)不应该依赖低层模块(子系统),而是通过外观类进行依赖。存在的缺陷?
可能导致“上帝类”:如果外观类封装过多逻辑,可能会变得过于庞大,形成“上帝类”(God Object),降低可维护性。
降低灵活性:如果客户端需要访问子系统的某些高级功能,而外观类没有提供接口,那么客户端仍然需要直接访问子系统,削弱了外观模式的意义。
可能引入性能问题:如果外观类封装了过多的子系统调用,而每次客户端调用外观类时都会触发所有子系统调用,可能会降低性能。你认为与它相关的设计模式有哪些? 它们之间的区别有哪些?
中介者模式(Mediator):
相似点:都用于降低对象之间的直接交互,提高模块解耦性。
区别:外观模式是为多个子系统提供统一入口,而中介者模式则是管理多个对象之间的交互关系,通常用于对象之间的通信,而非子系统之间的封装。适配器模式(Adapter):
相似点:都对现有系统进行了封装,以提供更方便的使用方式。
区别:适配器模式用于接口转换,使不兼容的接口能够协同工作,而外观模式只是提供一个简化的接口,并不改变子系统的行为。代理模式(Proxy):
相似点:都为客户端提供了一个间接访问的方式。
区别:代理模式通常用于控制对某个对象的访问,例如增加权限控制、缓存,而外观模式的主要目的是简化接口。*开源架构中哪些使用了这一模式?
Spring Framework
Spring 的 JdbcTemplate 就是外观模式的一个例子,它封装了 JDBC 的底层复杂逻辑,使得开发者可以更简单地执行 SQL 语句。
RestTemplate 也是外观模式,它对 HTTP 客户端进行封装,使得调用 REST API 变得简单。MyBatis
SqlSession 作为外观类,封装了底层数据库操作,使得开发者可以通过一个简单的 API 进行数据库查询。Dubbo
Dubbo 的 ServiceProxy 代理远程调用细节,对外提供一个简洁的调用方式。Log4j/SLF4J
SLF4J 是日志框架的外观模式,它统一了 Log4j、Logback 等日志实现,提供一个统一的 API,减少了对具体日志实现的依赖。

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

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

相关文章

从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.2行业落地挑战:算力成本与数据隐私解决方案

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第五部分:行业应用与前沿探索5.1.2 行业落地挑战:算力成本与数据隐私解决方案1. 算力成本挑战与优化策略1.1 算力成本的核心问题1.2 算力优化技术方案2. 数据隐私挑战…

量子计算与人工智能融合的未来趋势

最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。 在当今科技飞速发展…

六种光耦综合对比——《器件手册--光耦》

目录 十二、光耦 简述 基本结构 工作原理 主要特点 应用领域 优势与局限性 选择光耦时需要考虑的因素 详尽阐述 1 栅极驱动光耦 基本结构 工作原理 主要特点 应用领域 选择栅极驱动光耦时需要考虑的因素 典型产品示例 总结 2 逻辑输出光耦 基本结构 工作原理 主要特点 应用…

【蓝桥杯嵌入式——学习笔记一】2016年第七届省赛真题重难点解析记录,闭坑指南(文末附完整代码)

在读题过程中发现本次使用的是串口2,需要配置串口2。 但在查看产品手册时发现PA14同时也是SWCLK。 所以在使用串口2时需要拔下跳线帽去连接CH340。 可能是用到串口2的缘故,在烧录时发现报了一个错误。这时我们要想烧录得按着复位键去点击烧录&#xff0c…

三、GPIO

一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口GPIO引脚电平:0V(低电平)~3.3V(高电平),部分引脚可容忍5V 容忍5V,即部分引脚输入5V的电压,…

Java实战报错

哪错了 Preview 在这段Java代码中,map.put("Cc", 20); 这一行的键 "Cc" 被标记为错误。这可能是由于以下几种原因: 键值类型不匹配:虽然在你的代码中没有显示出来,但确保 HashMap 的键是 String 类型&#xf…

25大唐杯赛道一本科B组知识点大纲(下)

5G/6G网络技术知识点(10%) 工程概论及通信工程项目实践(20%) 5G垂直行业应用知识点(20%) ⭐⭐⭐为重点知识,尽量要过一遍哦 大唐杯赛道一国一备赛思路 大唐杯国一省赛回忆录--有付出就会有收…

docker的文件系统Overlay2

OverlayFS(Overlay2)文件系统深度解析 Overlay2 是 Docker 默认使用的联合文件系统(Union Filesystem),用于管理容器镜像的分层存储和容器运行时文件系统的合并。它基于 Linux 内核的 OverlayFS 技术,是早…

WebRTC技术简介及应用场景

写在前面 本文是参考稀土掘金的文章,整理得出,版权归原作者所有! 参考链接:https://juejin.cn/book/7168418382318927880/section/7171376753263247396 WebRTC(Web Real-Time Communication) 是一项开源技术,允许浏览器和移动应用直接进行…

Windows 图形显示驱动开发-WDDM 2.1 功能(四)

驱动程序版本控制 图形适配器或芯片集的驱动程序 DLL 和 SYS 文件必须具有正确格式的文件版本。 驱动程序信息文件 (.inf)、内核模式驱动程序 (.sys) 和用户模式驱动程序 (.dll) 文件的版本信息必须一致。 此外,.inf 的 [SignatureAttributes] 部分中标识为 PETru…

什么是 StarRocks?核心优势与适用场景解析

在数据量持续爆发的时代,企业对实时分析的需求日益迫切。例如,电商大促期间的交易监控、广告投放效果的即时反馈等场景,均要求毫秒级的响应速度。然而,传统工具如 Hadoop、Hive 等存在明显短板:复杂查询性能不足、资源…

Java基础 4.3

1.对象机制练习 public class Object03 {public static void main(String[] args) {Person a new Person();a.age 10;a.name "小明";Person b;b a;System.out.println(b.name);//小明b.age 200;b null;System.out.println(a.age);//200System.out.println(b.a…

视频设备轨迹回放平台EasyCVR综合智能化,搭建运动场体育赛事直播方案

一、背景 随着5G技术的发展,体育赛事直播迎来了新的高峰。无论是NBA、西甲、英超、德甲、意甲、中超还是CBA等热门赛事,都是值得记录和回放的精彩瞬间。对于体育迷来说,选择观看的平台众多,但是作为运营者,搭建一套体…

搬砖--贪心+排序的背包

a在上面b在下面->a.v-M-b.m>b.v-M-a.m->剩余率大 所以我先遍历a&#xff0c;让a在上面 这就是要考虑贪心排序的01背包 因为它有放的限制条件 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<ll,int>…

《2024年全球DDoS攻击态势分析》

从攻击态势来看&#xff0c;2024年DDoS攻击频次继续呈增长趋势&#xff0c;2024年同步增加1.3倍&#xff1b;超大规模攻击激增&#xff0c;超800Gbps同比增长3.1倍&#xff0c;累计高达771次&#xff0c;且互联网史上最大带宽和最大包速率攻击均被刷新&#xff1b;瞬时泛洪攻击…

数据分析参考架构详解

1.数仓方法论 2. 数仓建模参考架构 3.大数据参考架构 4.数据分析参考架构

领驭科技:以微软Azure Speech技术为核心,驱动翻译耳机新时代

在全球化的今天&#xff0c;语言不再是沟通的障碍。领驭科技&#xff0c;作为微软的核心合作伙伴&#xff0c;正引领翻译耳机行业进入一个全新的发展阶段。以时空壶与贸人为例&#xff0c;这两家公司的翻译耳机产品凭借其内置的微软Azure Speech人工智能语音技术&#xff0c;为…

seaweedfs分布式文件系统

seaweedfs https://github.com/seaweedfs/seaweedfs.git go mod tidy go -o bin ./… seaweed占不支持smb服务&#xff0c;只能用fuse的方式mount到本地文件系统 weed master 默认端口&#xff1a;9333&#xff0c;支持浏览器访问 weed volume 默认端口&#xff1a;8080 weed …

说清楚单元测试

在团队中推行单元测试的时候,总是会被成员问一些问题: 这种测试无法测试数据库的SQL(或者是ORM)是否执行正确?这种测试好像没什么作用?关联的对象要怎么处理呢?…借由本篇,来全面看一看单元测试。 单元测试是软件开发中一种重要的测试方法,其核心目的是验证代码的最小…

服务器磁盘io性能监控和优化

服务器磁盘io性能监控和优化 全文-服务器磁盘io性能监控和优化 全文大纲 磁盘IO性能评价指标 IOPS&#xff1a;每秒IO请求次数&#xff0c;包括读和写吞吐量&#xff1a;每秒IO流量&#xff0c;包括读和写 磁盘IO性能监控工具 iostat&#xff1a;监控各磁盘IO性能&#xff0c…