结构型设计模式

2023-09-13 19:35:21

结构型设计模式

结构型设计模式主要总结了一些类或对象组合在一起的经典结构,这些经典的结构可以解决特定应用场景的问题。结构模式包括:代理模式、桥接模式、装饰器模式、适配器模式、门面模式、组合模式、亨元模式。

1. 代理模式

实现方式:代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是为了控制访问,而非加强功能,这是它跟装饰器模式最大的不同。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。

静态代理与动态代理:静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板式的重复代码,增加了维护成本和开发成本。对于静态代理存在的问题,可以通过动态代理来解决。不事先为每个原始类编写代理类,而是在运行的时候动态地创建原始类对应的代理类,然后在系统中用代理类替换掉原始类。

使用场景:代码模式常用在业务系统中开发一些非功能性的需求,比如:监控、统计、鉴权、限流、事务、幂等、日志。将这些附加功能与业务功能解耦,放到代理类统一处理,只需要关注业务方面的开发。除此之外,代理模式还可以用在RPC、缓存等应用场景中。

2. 桥接模式

桥接模式的代码实现比较简单,但是理解起来比较有难度,并且应用场景也比较局限,所以,相对来说,桥接模式在实际项目中并没有那么常用,只需要简单了解,见到能认识就可以,并不是学习的重点。

理解方式:将抽象与实现解耦,让它们能够独立开发。这种理解方式比较特别,应用场景也不多。另外一种理解方式更加简单,等同于组合优于继承的设计原则,这种理解方式更加通用,应用场景比较多。不管是哪种理解方式,它们的代码结构都是相同的,都是一种类之间的组合关系。对于第一种理解方式,弄懂定义中 “抽象” 和 “实现” 两个概念,是理解它的关键。定义中的 “抽象”,指的并非是抽象类或接口,而是被抽象出来的一套类库,它只包含骨架代码,真正的业务逻辑需要委派给定义中的 “实现” 来完成。而定义中的 “实现” ,也并非 “接口的实现类”,而是一套独立的类库,“抽象” 和 “实现” 独立开发,通过对象的组合关系组装在一起。

3. 装饰器模式

装饰器模式主要解决继承关系过于复杂的问题,通过组合替代继承,给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要依据。除此之外,装饰器模式还有一个特点,就是可以对原始类嵌套使用多个装饰器。为了满足这样的需求,在设计的时候,装饰类需要跟原始类继承相同的抽象类或者接口。

4. 适配器模式

定义:代理模式、装饰器模式提供的都是跟原始类相同的接口,而适配器提供跟原始类不同的接口。适配器模式是用来做适配的,它将不兼容的接口转换为可兼容的接口。让原本由于接口不兼容而不能一起工作的类可以一起工作。

实现方式:类适配器和对象适配器。其中,类适配器使用继承关系来实现,对象适配器使用组合关系来实现。

适配器模式是一种事后的补救策略,用来补救设计上的缺陷。应用这种模式算是 “无奈之举”。如果在设计初期,就能规避接口不兼容的问题,那么这种模式就无用武之地了。在实际开发中,什么情况下才会出现接口不兼容呢?有下面 5 种场景

  1. 封装有缺陷的接口设计
  2. 统一多个类的接口设计
  3. 替换依赖的外部系统
  4. 兼容老版本接口
  5. 适配不同格式的数据
5. 门面模式

门面模式原理、实现都比较简单,应用场景比较明确。通过封装细粒度的接口,提供组合各个细粒度接口的高层次接口,来提高接口的易用性,或解决性能、分布式事务问题。

6. 组合模式

组合模式跟面向对象设计中的组合关系 ( 通过组合来组装两个类 ),完全是两码事。这里讲的 “组合模式”,主要是用来处理树形结构数据。正是因为其应用场景的特殊性,数据必须能表示成树形结构,这也导致了这种模式在实际的项目开发中并不那么常用。但是,一旦数据满足树形结构,应用这种模式就能发挥很大的作用,能让代码变得非常简洁。

组合模式,更像是对业务场景的一个数据结构和算法的抽象。其中,数据可以表示成树这种数据结构,业务需求可以通过在树上的递归遍历算法来实现。组合模式,将一组对象组织成树形结构,将单个对象和组合对象都看作树中的节点,以统一处理逻辑,并且利用树形结构的特点,递归地处理每个子树,依次简化代码实现。

7. 亨元模式

亨元就是被共享的单元。亨元模式的意图是复用对象,节省内存,当然前提是亨元对象是不可变对象。

具体来说,当一个系统中存在大量重复对象的时候,就可以利用亨元模式,将对象设计成亨元,在内存实例中保存一份实例,供多处代码引用,这样可以减少内存中对象的数量,以达到节省内存的目的。实际上,不仅仅相同的对象可以设计成亨元,对于相似对象,也可以将这些对象中相同的部分 (字段) ,提取出来设计成亨元,让大量相似对象引用这些亨元。

更多推荐

如何在macOS上安装Go并搭建本地编程环境

引言Go是一种诞生于挫折中的编程语言。在谷歌,开发人员厌倦了在为新项目选择语言时必须做出权衡。有些语言执行效率很高,但需要很长时间编译,而另一些语言易于编写,但在生产环境中运行效率很低。因此,谷歌发明了Go语言,并设计了这门语言以拥有这一切:快速编译、快速执行、易于编写和易于部署。虽然Go是一种通用语言,可用于从web

zookeeper

先说Paxos,它是一个基于消息传递的一致性算法,LeslieLamport在1990年提出,近几年被广泛应用于分布式计算中,Google的Chubby,Apache的Zookeeper都是基于它的理论来实现的,pxos还被认为是到目前为1唯一的分布式一性算法,其它的算法都是Paxos的改进或简化。有个问题要提一下,P

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录环境介绍:操作任务:步骤:1、数据库和文件结构准备2、建立拓扑规则3、一直下一页默认参数后,进行拓扑检查4、打开TP_CK_Topology,会自动带出拓扑要素,红色区域为拓扑错误的地方;5、编辑对应的图层,在编辑窗口选择:编辑器→更多编辑工具→拓扑。6、拓扑错误显示并处理7、最后对处理好的数据保存,导出即可8、操

绿源通过聆讯,两轮电动车“老江湖”,能否适应新时代?

作为两轮电动车领域历史最悠久的品牌之一,绿源的上市之路颇为波折。几次招股书失效后,绿源终于在9月19日成功通过港交所聆讯,跨过了这道门槛。此前,无论是招股书失效,还是在地方抽检中出现的不利新闻,都令外界认为,这个行业的内卷在催着绿源上市,获得更多博弈的资本。而从行业现实看,最重要的或许是两轮电动车的消费属性在不断变化,

相机HAL

相机HAL1、概览实现HAL2、相机HAL2.1AIDL相机HAL2.2相机HAL3功能2.3CameraHAL1概览相机HAL相机实现HALandroid12-release1、概览实现HALHAL位于相机驱动程序和更高级别的Android框架之间,它定义您必须实现的接口,以便应用可以正确地操作相机硬件。相机HAL的

从入局到破局:商家怎样挖掘视频号的新增量?

主笔:yolo出品:增长黑盒研究组在上一篇研究报告中,我们站在消费者的角度和市场大盘对视频号进行了分析,某种程度上是对于“终局”的展望:用户行为的变化、人群结构的变化等因素下,塑造除了视频号差异化的商业价值,为品牌提供了一个与用户建立深度关系的场景,因而存在可观的新增量空间。在本篇报告中,我们将视角切换回品牌和商家,看

什么是 AirServer?Mac专用投屏工具AirServer 7 .27 for Mac中文破解版百度网盘下载

AirServer7.27forMac中文免费激活版是一款Mac专用投屏工具,能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App,从iOS设备无线传送到Mac电脑的屏幕上,把Mac变成一个AirPlay终端的实用工具。目前最新的AirServer7.2.7版本,支持macOSHighSierra

NestJS 中的 gRPC 微服务通信

想象一下,你回家过节,你的家人决定聚会。而不是让一个人做所有的烹饪,每个人都同意带上他们擅长制作的特色菜。目标是通过组合所有这些菜肴来制作一顿完整的饭菜。你同意做鸡肉炒饭,你哥哥做甜点蛋糕,妹妹做沙拉。每个菜代表一个具有特定功能或用途的微服务。例如,炒饭代表一道丰盛的主菜;沙拉代表新鲜健康的配菜,蛋糕代表甜蜜甜点。在微

3年测试经验,测试用例应该达到这个水平才合格

状态迁移法主要关注在测试状态转移的正确性上面。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态,是否可能产生非法的状态转移等。通过构造能导致状态迁移的事件,来测试状态之间的转换。1、应用范围状态迁移法的思想是提供将多个状态的转换串起来进行测试的思路。该方法适合功

设计模式七大原则

设计模式七大原则什么是设计模式呢?简单理解就是我们在开发软件的期间面临着各种各样的问题,对这种普遍存在(反复出现)的问题提出的解决方案。设计模式分为三种类型,共23种1)创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。2)结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理

微服务: xxl-job的安装(docker),使用及springboot整合[完整版详解]

全文目录,一篇结束1.前言简介1.1xxl-job的作用及优势1.1.1xxl-job作用1.1.2xxl-job优势1.2资源位置及使用说明1.2.1文档说明1.2.2docker镜像位置2.安装配置使用xxl-job(两种)2.0公共操作:sql脚本(2.2免下载也用)2.1方法一:源码搭建方式2.1.1源码下载位

热文推荐