设计模式之结构型模式

本文已收录于专栏
《设计模式》

目录

  • 概念说明
    • 大话设计模式
    • 结构型模式
  • 各模式详解
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
  • 其他模式
  • 总结提升

概念说明

大话设计模式

  大话设计模式主要分为三部分,第一部分是创建型模式,第二部分是结构型模式,第三部分是行为型模式。至于为什么要分为这三部分,我的理解是创建型是用于创建对象的而结构型是发生在类与类之间的关系是比较宏观的,比如说组合或者交互。行为型是一个微观的关系主要体现在对象与对象之间和方法与方法之间。接下来说一说结构型模式。

结构型模式

  结构型模式描述如何将类或对象按某种布局组成更大的结构。结构型模式就像搭积木,将不同的类结合在一起形成契合的结构。结构型模式包括:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。

各模式详解

适配器模式(Adapter Pattern)

在这里插入图片描述

  • 好处:将不兼容的接口转换为可兼容的接口,使得不同类之间可以协同工作。提供了一种无侵入的方式来实现接口的适配。
  • 使用场景:当需要将一个类的接口转换为另一个类的接口时,可以使用适配器模式。例如,将第三方库的接口适配为自己项目中的接口。

桥接模式(Bridge Pattern)

在这里插入图片描述

  • 好处:将抽象部分与实现部分分离,使它们可以独立变化。提供了一种灵活的方式来组合不同的抽象和实现。
  • 使用场景:将抽象部分与实现部分分离,使它们可以独立变化。提供了一种灵活的方式来组合不同的抽象和实现。

组合模式(Composite Pattern)

在这里插入图片描述

  • 好处:将对象组织成树形结构,使得客户端可以统一处理单个对象和组合对象。简化了客户端的代码,提高了代码的可扩展性。
  • 使用场景:当需要表示对象的部分-整体层次结构,并且希望客户端以统一的方式处理单个对象和组合对象时,可以使用组合模式。例如,文件系统的目录和文件的组织。

装饰器模式(Decorator Pattern)

在这里插入图片描述

  • 好处:动态地为对象添加额外的功能,而无需修改原始对象的结构。提供了一种灵活的方式来扩展对象的功能。
  • 使用场景:当需要在不改变现有对象结构的情况下,为对象添加额外的功能时,可以使用装饰器模式。例如,给文本编辑器添加加粗、斜体等格式功能。

外观模式(Facade Pattern)

在这里插入图片描述

  • 好处:提供了一个统一的接口,隐藏了子系统的复杂性,使得客户端可以更简单地使用子系统。简化了客户端的代码,提高了代码的可读性和可维护性。
  • 使用场景:当需要为复杂的子系统提供一个简单的接口,并且希望客户端不直接与子系统交互时,可以使用外观模式。例如,封装底层库的复杂调用逻辑。

享元模式(Flyweight Pattern)

在这里插入图片描述

  • 好处:共享细粒度的对象,减少内存使用,提高性能。通过共享,可以在有限的内存中支持大量的对象。
  • 使用场景:当需要创建大量相似的对象,并且这些对象可以共享部分状态时,可以使用享元模式。例如,字符缓存池、线程池等。

其他模式

创建型模式:https://blog.csdn.net/weixin_45490198/article/details/131432094
行为型模式:https://blog.csdn.net/weixin_45490198/article/details/131433336

总结提升

  结构型设计模式提供了一种灵活、可复用和可扩展的方式来组织和管理对象之间的关系。正确地选择和使用适合的设计模式可以提高代码的可维护性、可读性和可测试性,并帮助我们构建更好的软件系统。


🎯 此文章对你有用的话记得留言+点赞+收藏哦🎯

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

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

相关文章

刘汝佳samaのDLX详解

引入 精确覆盖问题(Exact Cover Problm) 有一些由整数 1~n 组成的集合 S 1 , S 2 , S 3 , … , S r S_1,S_2,S_3,…,S_r S1​,S2​,S3​,…,Sr​, 要求选择若干个集合 S i S_i Si​,使1~n 的每个整数恰好在一个集合中出现。比如&#xff0c…

基于JSP+Servlet的文件上传与下载

基于JSPServlet的文件上传与下载 一、系统介绍二、功能展示1.项目骨架2.单文件上传3.多文件上传4.下载文件1.其他系统实现五.获取源码 一、系统介绍 项目类型:Java web项目 项目名称:基于JSPServlet的文件上传与下载案例 项目架构:B/S架构…

Flutter学习四:Flutter开发基础(五)资源管理

目录 0 引言 1 资源管理 1.1 指定 assets 1.2 Asset 变体(variant) 1.3 加载 assets 1.3.1 加载文本 1.3.2 加载图片 1.3.2.1 声明分辨率相关的图片 1.3.2.2 加载图片 1.3.3 依赖包中的资源图片 1.3.4 打包包中的 assets 1.3.5 特定平台 as…

【Spring】— Spring MVC复杂数据绑定

目录 复杂数据绑定1.绑定数组2.绑定集合 复杂数据绑定 实际项目开发中,除了简单数据类型外,还会经常遇到一些比较复杂的数据绑定问题,比如数组的绑定、集合的绑定,接下来将具体讲解一下数组绑定和集合绑定的使用。 1.绑定数组 …

adb 工具

小白初如嵌入式的坑,对于串口调试工具,之前一直只知道有SecureCRT这一种方式; 但是在最近一次的使用过程中,发现抢占资源的情况出现,两个进程之间相互打架,这个时候需要 查看top(嵌入式板子资…

此导入从不用作值,必须使用 “import type“ ,因为 “importsNotUsedAsValues“ 设置为 “error“。

前言 最近电脑更新了一次系统,重启后在 VsCode中打开项目 ,发现原本正常的代码出现了一堆语法提示。网上搜了一下,没有找到关于此问题的回答,不知道我是不是第一个遇到的。在此记录一下这次的经历,如果有其他人遇到&a…

数据结构--队列的基本概念

数据结构–队列的基本概念 队列的定义 队列其实是一种受限制的线性表 队列(Queue):是 只允许在一端进行插入或删除操作 \color{red}只允许在一端进行插入或删除操作 只允许在一端进行插入或删除操作的线性表 重要术语: 队头、队尾、空队列 队列的特点: 先进先出 \…

5.4.1 虚拟专用网VPN

5.4.1 虚拟专用网VPN 我们已经学习了因特网的路由协议(5.3.1 因特网的路由协议(一)、5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议、5.3.3 因特网的路由协议(三)OSPF协议、5.3.4 因特…

ModaHub魔搭社区:向量数据库Milvus性能调优教程(二)

目录 索引 其他 存储优化 常见问题 索引 向量索引的基本概念请参考 向量索引概述。 选择合适的索引需要在存储空间、查询性能、查询召回率等多个指标中权衡。 FLAT 索引 FLAT 是对向量的暴力搜索(brute-force search),速度最慢&#…

CMake使用gRPC(Protobuf) 的c++ demo

gRPC的命令参数里, 1. 如果要用pacakge,需要--proto_path的参数, 例如helloworld.proto的绝对路径是 /home/user/grpc_demo_ws/grpc_demo/hello_world/proto/helloworld.proto 在helloworld.proto里面的pacakge是 package grpc_demo.hello_w…

模仿QQ之右键菜单

参考:QT多级菜单 - 知乎 (zhihu.com) 运行效果图: 关键代码: void personMenu::contextMenuEvent(QContextMenuEvent *event) {//我完全可以写出一个代码生成器来把这些代码生成出来。parentnew QMenu(this);parent->addAction(QIcon(…

【玩转循环】探索Python中的无限可能性

前言 循环可能是每个编程语言中使用比较多的语法了,如果能合理利用好循环,就会出现意想不到的结果,大大地减少代码量,让机器做那些简单枯燥的循环过程,今天我将为大家分享 python 中的循环语法使用。🚗&am…