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

深入了解软件设计模式:创新应用与优化代码结构

前言

在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应用场景和优势。

现代软件工程中,使用设计模式是构建高质量、可维护和可扩展软件的关键。设计模式提供了经过验证的解决方案,帮助开发人员有效地应对复杂性和变化。了解不同类型的设计模式不仅有助于提升代码的设计和结构,还能够加深对软件工程原理的理解,从而成为更优秀的软件开发者。

1. 创建型模式

创建型模式关注对象实例化的方法,旨在提供灵活的对象创建机制,以满足不同场景下的需求。

  • 工厂模式(Factory Pattern):通过定义一个创建对象的接口,将对象的实例化延迟到其子类,实现了代码的灵活性和可扩展性。例如,一个汽车工厂可以根据客户需求生产不同类型的汽车。

  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关对象的接口,而无需指定具体类。比如,在一个电子产品制造系统中,抽象工厂可以创建手机、平板和笔记本电脑等产品。

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。典型的应用包括线程池、配置管理器等需要唯一实例的场景。

  • 建造者模式(Builder Pattern):将复杂对象的构建过程与其表示分离,使得可以使用相同的构建过程创建不同的表示。例如,在游戏中建造者模式可以用来构建不同类型的角色。

  • 原型模式(Prototype Pattern):通过复制现有对象来创建新对象,避免了通过构造函数创建对象时的重复开销。在图形编辑软件中,可以使用原型模式复制和修改复杂的图形对象。

2. 结构型模式

结构型模式关注如何组合类和对象形成更大的结构,以解决系统结构复杂性和提高代码复用性。

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。例如,将不同格式的数据转换为统一格式供系统使用。

  • 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们可以独立地变化。在操作系统中,桥接模式可以将不同的文件系统接口与文件系统实现分离开来。

  • 装饰者模式(Decorator Pattern):动态地给一个对象添加额外的职责,比生成子类更为灵活。例如,在咖啡店中,顾客可以根据个人口味选择不同的咖啡调料,装饰者模式可以动态添加这些调料。

  • 外观模式(Facade Pattern):为复杂子系统提供一个简化的接口,客户端通过外观接口访问系统,而不需要了解系统内部的复杂结构。在电子商务系统中,外观模式可以隐藏订单处理、库存管理等复杂业务流程。

  • 享元模式(Flyweight Pattern):通过共享技术有效地支持大量细粒度的对象,以节省内存和提高性能。例如,在文本编辑器中,享元模式可以共享相同的字体和颜色对象,减少内存占用。

  • 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次关系,使得客户端可以统一处理单个对象和组合对象。在文件系统中,组合模式可以用来表示文件夹和文件的关系。

3. 行为型模式

行为型模式关注对象之间的通信和职责分配,以提高系统的灵活性和可扩展性。

  • 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。在游戏开发中,模板方法模式可以定义游戏角色的行为流程。

  • 策略模式(Strategy Pattern):定义一系列算法,将每个算法封装起来,并使它们可以相互替换。例如,电商平台可以根据不同的支付策略实现多种支付方式。

  • 观察者模式(Observer Pattern):定义对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。在股票市场软件中,观察者模式可以实现股票价格实时更新。

  • 迭代器模式(Iterator Pattern):提供一种顺序访问集合对象元素的方法,而不需要暴露其内部表示。在社交网络中,迭代器模式可以用来遍历用户的好友列表。

  • 责任链模式(Chain of Responsibility Pattern):将请求的发送者和接收者解耦,通过多个对象对请求进行处理,直到找到合适的处理者。例如,在客服系统中,可以使用责任链模式处理客户问题。

  • 命令模式(Command Pattern):将请求封装为一个对象,从而允许客户端参数化请求并将其排队、记录请求日志,或者支持撤销操作。在智能家居系统中,命令模式可以实现对家电设备的远程控制。

  • 状态模式(State Pattern):允许对象在内部状态发生改变时改变其行为。例如,交通信号灯根据不同的状态(红灯、绿灯、黄灯)改变交通流向。

  • 访问者模式(Visitor Pattern):在不改变元素类的前提下,定义作用于这些元素的新操作。在图形设计软件中,访问者模式可以用来实现对不同图形元素的不同操作,如计算面积或生成SVG。

总结

本文详细介绍了创建型、结构型和行为型设计模式,每种模式都有其独特的应用场景和优势。通过合理应用设计模式,开发人员能够提高代码的质量、可维护性和可扩展性,从而更加高效地应对复杂的软件开发挑战。选择适合项目需求的设计模式,是每个软件开发者在提升技能和解决实际问题中的关键一步。

相关文章:

深入了解软件设计模式:创新应用与优化代码结构

前言 在软件开发中,设计模式被广泛应用,通常分为三大类:创建型、结构型和行为型。这些模式经过时间验证,在解决特定问题和优化代码结构方面发挥了重要作用。本文将详细介绍每一类设计模式,并通过具体实例展示它们的应…...

android studio 模拟器文件查找

android studio 模拟器文件查找 使用安卓模拟器下载文件后通常无法在系统硬盘上找到下载的文件,安卓 studio studio 其实提供了文件浏览工具,找到后可以直接使用 Android studio 打开 打开 Android studioview 菜单view > Tool Windows > Device…...

【科普】半导体制造过程的步骤、技术、流程

在这篇文章中,我们将学习基本的半导体制造过程。为了将晶圆转化为半导体芯片,它需要经历一系列复杂的制造过程,包括氧化、光刻、刻蚀、沉积、离子注入、金属布线、电气检测和封装等。 基本的半导体制造过程 1.晶圆(Wafer&#xf…...

c89、c99、c11

C99 标准开始引入了 // 单行注释。在此之前,C语言只支持 /* ... */ 多行注释。 具体说明: // 单行注释:在C99标准(ISO/IEC 9899:1999)引入之前,C语言中没有单行注释。C99标准借鉴了C的注释风格&#xff0…...

【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1:8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…...

【C#】使用数字和时间方法ToString()格式化输出字符串显示

在C#编程项目开发中,几乎所有对象都有格式化字符串方法,其中常见的是数字和时间的格式化输出多少不一样,按实际需要而定吧,现记录如下,以后会用得上。 文章目录 数字格式化时间格式化 数字格式化 例如,保留…...

Mac系统主机名变为bogon的解决方案

如题 在使用Mac操作系统时,您可能会遇到一个有趣且略显困扰的问题:终端中显示的主机名突然变成了“bogon”。这不仅让人困惑,还可能给日常操作带来不便。本文旨在提供一种简便的解决方法,帮助您将主机名恢复为正常状态。 什么是…...

行列式和矩阵的区别

目录 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 一、行列式 1. 行列式的定义 2. (全)排列 3. 逆序数 二、矩阵 1. 矩阵的定义 三、行列式和矩阵的区别 四、参考书目 同济大学数学系. 工程数学…...

MATLAB复习

MATLAB常用的标点符号 空格 变量分隔符 矩阵一行中各元素间的分隔符 程序语句关键词分隔符 逗号,分隔显示计算结果的各语句 变量分隔符 矩阵中一行各元素的分隔符点号.数值中的小数点 结构数组的域访问符分号;分隔不想显示计算结果的各语句 矩阵行与行的…...

Android11 动态权限申请

1、单个权限检查及申请 private void checkSinglePermission(){// 在需要的地方,如Activity中if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)! PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,…...

线性卷积(相关)和圆周卷积(相关)以及FFT之间的关系(AEC举例)

时域自适应滤波算法中的线性卷积和线性相关运算量较大,导致计算复杂度升高,我们更愿意把这两个信号变换到频域,通过频域相乘的方式来取代时域复杂度相当高的卷积或相关运算。 预备知识:线性卷积(相关)和圆…...

AMD平台,5600X+6650XT,虚拟机安装macOS 14(2024年6月)

AMD平台安装macOS 14的麻烦,要比Intel平台多的多,由于macOS从13开始,对CPU寄存器的读取进行了改变,导致AMD平台只要安装完macOS 13及以后版本,开机后就报五国语言错误,不断重启。改vmx文件,被证…...

Spring源码之手写DI

Spring源码之手写DI 我们来回顾一下前面手写IOC的内容。 一、DI介绍 DI(Dependency injection)依赖注入。对象之间的依赖由容器在运行期决定,即容器动态的将某个依赖注入到对象之中。说直白点就是给Bean对象的成员变量赋值。 在这里我们就需要明白几个问题。 1.…...

从零入手人工智能(5)—— 决策树

1.前言 在上一篇文章《从零入手人工智能(4)—— 逻辑回归》中讲述了逻辑回归这个分类算法,今天我们的主角是决策树。决策树和逻辑回归这两种算法都属于分类算法,以下是决策树和逻辑回归的相同点: 分类任务&#xff1…...

go语言:两协程并发交替打印数字和字母(代码逐行注释)

要求: 并发两协程交替打印数字和字母。一个协程打印数字,一个协程打印字母。 输出: 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路: 两个 channel 控制两个协程进行交替打印。sync.WaitG…...

TWM论文阅读笔记

这是ICLR2023的一篇world model论文,用transformer来做世界模型的sequence prediction。文章贡献是transformer-based world model(不同于以往的如transdreamer的world model,本文的transformer-based world model在inference 的时候可以丢掉…...

探索ChatTTS项目:高效的文字转语音解决方案

文章目录 📖 介绍 📖📒 ChatTTS 📒📝 项目介绍📝 项目亮点📝 UI 🎈 项目地址 🎈 📖 介绍 📖 在AI技术迅速发展的今天,文本到语音&…...

[Django学习]Q对象实现多字段模糊搜索

一、应用场景 假设我们现在有一个客房系统,前端界面上展示出来了所有客房的所有信息。用户通过客房的价格、面积、人数等对客房进行模糊搜索,如检索出价格在50到100元之间的客房,同时检索面积在20平方米到30平方米之间的客房,此时后端可以借助…...

transdreamer 论文阅读笔记

这篇文章是对dreamer系列的改进,是一篇world model 的论文改进点在于,dreamer用的是循环神经网络,本文想把它改成transformer,并且希望能利用transformer实现并行训练。改成transformer的话有个地方要改掉,dreamer用ht…...

AIGC技术的发展现状与未来趋势探讨

AIGC技术的发展现状与未来趋势探讨 随着人工智能(AI)技术的迅猛发展,AI生成内容(AI-Generated Content,AIGC)成为了一项颠覆性的技术,它能够自动生成文本、图像、音频和视频等多种内容。本文将…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...