【设计模式-1】软件设计模式概述

news/2025/1/8 2:02:44/

1. 软件设计模式的产生背景

设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。
1977 年,美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Christopher Alexander)在他的著作《建筑模式语言:城镇、建筑、构造(A Pattern Language: Towns Building Construction)中描述了一些常见的建筑设计问题,并提出了 253 种关于对城镇、邻里、住宅、花园和房间等进行设计的基本模式。

在这里插入图片描述

1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将克里斯托夫·亚历山大的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。

1994 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,系统地介绍了23种经典的设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,GoF)匿名著称。

2. 软件设计模式的概念与意义

2.1 软件设计模式的概念

软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码设计经验的总结,具有一定的普遍性,可以反复使用。其目的是为了提高代码的可重用性、代码的可读性和代码的可靠性。

2.2 学习设计模式的意义

设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解。正确使用设计模式具有以下优点。

  1. 提高代码复用性设计模式提供了一种标准化的解决方案,避免了重复造轮子。
  2. 增强代码可维护性:通过使用设计模式,代码结构更加清晰,易于理解和修改。
  3. 提升开发效率:开发人员可以直接使用成熟的设计模式,减少设计时间。
  4. 促进团队协作设计模式为开发团队提供了一种共同的语言,便于沟通和协作。
  5. 降低系统复杂度:通过合理的模式选择,可以将复杂问题分解为更小的、可管理的部分。

3. 软件设计模式的基本要素

软件设计模式使人们可以更加简单方便地复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、结构、模式角色、合作关系、实现方法、适用性、已知应用、例程、模式扩展和相关模式等,其中最关键的元素包括以下 4 个主要部分。

3.1 模式名称(Pattern Name)

  • 每一个模式都有自己的名字,通常用一两个词来描述,可以根据模式的问题、特点、解决方案、功能和效果来命名。模式名称(PatternName)有助于我们理解和记忆该模式,也方便我们来讨论自己的设计。例如,“单例模式”、“工厂模式”等。

3.2 问题(Problem)

  • 描述了设计模式所要解决的具体问题或场景。例如,如何确保一个类只有一个实例,或者如何动态地创建对象。

3.3 解决方案(Solution)

  • 模式问题的解决方案(Solution)包括设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象的 组合)来解决这个问题。

3.4 效果(Consequences)

  • 描述了模式的应用效果以及使用该模式应该权衡的问题,即模式的优缺点。主要是对时间和空间的衡量,以及该模式对系统的灵活性、扩充性、可移植性的影响,也考虑其实现问题。显式地列出这些效果(Consequence)对理解和评价这些模式有很大的帮助。

4. 设计模式的应用场景

  1. 单例模式:用于需要全局唯一实例的场景,如数据库连接池、日志管理器。
  2. 工厂模式:用于需要动态创建对象的场景,如依赖注入框架。
  3. 观察者模式:用于事件驱动系统,如GUI框架中的事件监听。
  4. 适配器模式:用于整合不兼容的接口,如旧系统与新系统的对接。
  5. 装饰器模式:用于动态扩展对象功能,如Java的I/O流。

5. 设计模式的局限性

尽管设计模式有很多优点,但也存在一些局限性:

  1. 过度使用:滥用设计模式可能导致代码过度设计,增加复杂性。
  2. 学习成本:掌握设计模式需要时间和经验,新手可能难以理解。
  3. 适用性:并非所有场景都适合使用设计模式,需要根据具体问题选择。

6. 总结

设计模式是软件开发中的宝贵财富,它提供了一种高效、可复用的解决方案,帮助开发人员应对复杂系统的设计挑战。通过理解设计模式的背景、概念、意义和基本要素,开发人员可以更好地应用这些模式,提升代码质量和开发效率。然而,设计模式并非银弹,合理使用才能发挥其最大价值。在实际开发中,应根据具体需求选择合适的设计模式,避免过度设计。


http://www.ppmy.cn/news/1561133.html

相关文章

我用AI学Android Jetpack Compose之Kotlin篇

前面我们大致了解了Compose项目的结构,基本代码,构建脚本等,这次我们来了解Kotlin的基本语法,答案 来自 通义千问 文章目录 1.我要学习Compose开发,请给我科普一下基本的Kotlin知识1. **变量声明**2. **函数定义**3. *…

微记录-Linux字符设备的write函数如何避免文件系统重复调用?

背景 linux字符设备的fops实现read write的时候,尤其是write,因为会指定写入的总长度,那么如果如果驱动中单次write最大个数小于需求len的时候,文件系统就会多次调用到write。他是根据wirte函数的返回值来判断的。如果返回值不是…

封装/前线修饰符/Idea项目结构/package/impore

目录 1. 封装的情景引入 2. 封装的体现 3. 权限修饰符 4. Idea 项目结构 5. package 关键字 6. import 关键字 7. 练习 程序设计:高内聚,低耦合; 高内聚:将类的内部操作“隐藏”起来,不需要外界干涉&#xff1b…

Laravel操作ElasticSearch

在Laravel项目中操作ElasticSearch可以通过以下步骤来实现,通常会借助相应的ElasticSearch客户端扩展包。 ### 安装ElasticSearch客户端包 在Laravel项目中,常用的是 elasticsearch/elasticsearch 这个PHP客户端库来与ElasticSearch进行交互&#xff0c…

【MATLAB】【Simulink仿真】向模型中添加自定义子系统

一、子系统的创建 1、启动Simulink,选择【新建】——【空白子系统】——【创建子系统】 2、选择【浏览组件库】,创建使能子系统。 3、保存至当前工作目录。 二、建立模型仿真 1、启动Simulink,选择【新建】——【空白子系统】——【创建子系…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(五)

****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 五、 解释评估(Explanation Evaluation) 在前面的章节中,我们介绍了不同的解释技术和它们的用途&#…

oceanbase 集群启动操作

1.启动ocp服务(一般启动操作系统会自动启动ocp) 1.1确认observer直接的时间同步 2.登录ocp重启observer 服务器ocp agent 2.1选择主机→需要重启的机器→重启ocp agent 2.2观察重启ocp agent任务运行情况 2.3确认主机状态为在线 2.4确认所有主机在线 3…

工业5G路由器让无人机数据传输 “飞” 起来

无人机上搭载5G通信模块,该模块与工业5G路由器通过5G网络建立连接。无人机的飞控系统、传感器以及摄像头等设备采集到的数据,如飞行姿态、高度、速度、环境图像、温度湿度等,经过编码、加密、调制等处理后转换为适合5G网络传输的信号形式。 …