登录/注册

程序设计模式

更多

好的,程序设计模式(Design Pattern)是解决软件设计中特定场景下常见问题的、可复用的优秀设计方案模板。它们不是可以直接转换为代码的完整解决方案,而是描述了如何组织类和对象来解决一类问题的核心思想、结构和交互方式

为什么需要设计模式?

  1. 复用经验: 封装了专家们多年积累的、被验证有效的解决方案,避免重新摸索。
  2. 提升沟通效率: 提供了标准化的术语(如“单例”、“观察者”、“策略”),开发者一说模式名称,大家就理解了背后的设计思路。
  3. 提高代码质量:
    • 可维护性: 代码结构更清晰、模块化,易于理解和修改。
    • 可扩展性: 更容易添加新功能或变更现有功能。
    • 可复用性: 核心设计思想可以在不同项目中复用。
    • 灵活性/解耦: 降低模块间的依赖关系(耦合度),使系统更灵活。
  4. 代码更优雅: 遵循良好设计原则(如 SOLID 原则)的代码通常更优雅、健壮。

设计模式的分类 (经典的 GoF 23 种模式):

主要分为三大类:

  1. 创建型模式 (Creational Patterns):

    • 关注点: 如何创建对象。它们将对象的创建与使用分离,使得系统更灵活,不依赖于具体类。
    • 常用模式:
      • 单例模式 : 确保一个类只有一个实例,并提供全局访问点。(如:数据库连接池、配置管理器)
      • 工厂方法模式 : 定义一个创建对象的接口,但让子类决定实例化哪一个类。(如:创建不同类型日志记录器)
      • 抽象工厂模式 : 提供一个接口,用于创建相关或依赖对象家族,而不指定它们的具体类。(如:为不同操作系统创建配套的 UI 控件族 - 按钮、复选框)
      • 建造者模式 : 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。(如:构造一顿包含不同菜品、饮料、甜点的复杂套餐)
      • 原型模式 : 通过复制现有对象(原型)来创建新对象,避免了昂贵的初始化过程。(如:游戏场景中快速生成大量相似敌人)
  2. 结构型模式 (Structural Patterns):

    • 关注点: 如何组合类和对象以形成更大的结构。它们关注类和对象的组合关系,简化设计,提升复用性和灵活性。
    • 常用模式:
      • 适配器模式 : 将一个类的接口转换成客户期望的另一个接口。让原本接口不兼容的类可以协同工作。(如:电源转接头、将第三方日志库接口适配到系统定义的日志接口)
      • 桥接模式 : 将抽象部分与其实现部分分离,使它们都可以独立地变化。(如:不同形状和颜色的绘图组合,避免形状类爆炸)
      • 组合模式 : 将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。(如:文件系统目录与文件、UI 控件树)
      • 装饰器模式 : 动态地给一个对象添加一些额外的职责。相比生成子类更为灵活(扩展功能但不改变原有结构)。(如:给咖啡添加牛奶、糖等配料)
      • 外观模式 : 为子系统中的一组接口提供一个一致的、简化了的界面(高层接口),降低使用子系统的复杂度。(如:编译器提供的简单编译命令背后调用了词法分析、语法分析、优化、代码生成等多个复杂模块)
      • 享元模式 : 运用共享技术有效地支持大量细粒度的对象。通过共享相同的内在状态来减少内存开销。(如:文本编辑器中的字符对象共享,只存储一次字符码值,位置和字体等作为外部状态单独存储)
      • 代理模式 : 为其他对象提供一种代理以控制对这个对象的访问。(如:远程代理访问网络对象、虚拟代理延迟加载大对象、保护代理控制权限)
  3. 行为型模式 (Behavioral Patterns):

    • 关注点: 对象之间的职责分配和算法的封装。它们主要关注对象间的通信、协作以及职责的划分。
    • 常用模式:
      • 责任链模式 : 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。(如:审批流程、异常处理链)
      • 命令模式 : 将“请求”封装成一个对象,从而使你可用不同的请求对客户进行参数化、对请求排队或记录请求日志,以及支持可撤销的操作。(如:GUI 菜单命令、事务操作、宏命令)
      • 解释器模式 : 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。(如:正则表达式引擎、SQL 解析)
      • 迭代器模式 : 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。(如:遍历集合元素的不同方式 - 顺序、逆序、按条件)
      • 中介者模式 : 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。(如:聊天室服务器协调多个用户间的消息传递,代替用户间直接相互引用)
      • 备忘录模式 : 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。以后就可将该对象恢复到原先保存的状态。(如:游戏存档、撤销/恢复操作)
      • 观察者模式 / 发布-订阅模式 : 定义了对象间的一种一对多的依赖关系,当一个对象(目标/主题)的状态发生改变时,所有依赖于它的对象(观察者)都将得到通知并自动更新。(如:GUI 事件监听、消息队列发布订阅、数据绑定)
      • 状态模式 : 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。(如:订单的不同状态 - 待付款、待发货、已发货 - 及其对应的行为)
      • 策略模式 : 定义一系列算法,将它们一个个封装起来,并且使它们可以相互替换。策略模式使得算法可以独立于使用它的客户而变化。(如:不同的排序算法(冒泡、快排、归并)、不同的支付方式(支付宝、微信、银联))
      • 模板方法模式 : 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。(如:泡茶和泡咖啡的流程骨架相同 - 烧水、冲泡、倒入杯子、加调料,但具体冲泡和加调料的步骤不同)
      • 访问者模式 : 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。(如:对不同类型的文件节点执行不同的操作 - 压缩、杀毒)

重要原则和观念:

学习和使用建议:

  1. 理解问题本质: 不要为了用模式而用模式。首先要理解你遇到的问题是什么,模式的适用场景是什么。
  2. 掌握核心思想: 理解模式解决了什么问题如何解决的(核心结构)优缺点以及适用场景。代码实现是次要的。
  3. 从常用模式入手: 单例、工厂方法、抽象工厂、适配器、观察者、策略、模板方法、装饰器、代理、责任链、命令等都是非常常用的模式,优先掌握。
  4. 阅读经典: 《设计模式:可复用面向对象软件的基础》(GoF 书) 是奠基之作。同时也有很多优秀的博客、教程和开源项目可供学习。
  5. 实践与反思: 在项目中尝试应用,不断思考模式带来的好处和潜在的成本(如增加的复杂度)。注意避免过度设计。

总而言之,设计模式是经验智慧的结晶,是解决特定设计问题的工具包。熟练掌握它们能极大提升你的软件设计能力,写出更健壮、灵活、可维护的代码。但切记:模式是手段,不是目的,合适才是最重要的。

C语言程序设计中动态内存分配如何实现

C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?

2023-09-28 16:53:41

嵌入式软件程序设计方案

在嵌入式软件程序设计过程中中,经常会遇到超时(或定时)的处理情况,基本处理思想是在时间到的时候进行相关程序处理,下面介绍两种超时(或定时)的程序设计

2023-09-06 09:27:01

浅谈项目中的程序设计思路与步骤

对于一个没有太多程序设计经验的萌新工程师来说,如何有规划有条理的进行程序设计,是一个很值得学习的课题。在本文中,作者结合自身的经验,浅要的谈一谈项目中的程序设

2023-09-04 10:48:18

C语言程序设计第四讲结构化程序设计之选择

C语言程序设计第四讲结构化程序设计之选择

资料下载 ah此生不换 2021-12-22 10:34:31

Python的程序设计资料合集

本文档的主要内容详细介绍的是Python的程序设计资料合集免费下载。

资料下载 佚名 2021-03-22 15:17:29

Linux窗口程序设计

Linux窗口程序设计说明。

资料下载 姚小熊27 2021-03-18 10:10:15

汇编程序设计的教程课件免费下载

本文档的主要内容详细介绍的是汇编程序设计的教程课件免费下载包括了:汇编语言与汇编器,汇编语言程序规范,伪指令及应用,宏指令及应用,汇编语言程序设计

资料下载 佚名 2020-03-16 17:08:00

JAVA程序设计教程之JSP程序设计实验

本文档的主要内容详细介绍的是JAVA程序设计教程之JSP程序设计实验。

资料下载 佚名 2019-11-05 15:34:13

C语言程序设计--火车订票系统

C语言程序设计--火车订票系统

2023-08-01 00:40:52

C语言程序设计--学生信息管理系统

C语言程序设计--学生信息管理系统

2023-08-01 00:38:38

解析PLC梯形图程序设计

解析PLC梯形图程序设计

2023-06-30 11:14:25

关于嵌入式RTOS程序设计的5个建议

  今天聊一下RTOS应用程序设计的五个实践技巧。

2022-11-18 10:33:18

c语言程序设计案例教程

c语言程序设计案例教程篇一下面让我们看一下如何学习C语言。了解C语言的特点和有关概念:如C语言的发展过程、C语言版本、C语言特点、C和C++的区别等!了解C语言的数据类型和算法:如基本数

2021-07-20 07:25:24

PLC程序设计的五个步骤

PLC程序设计一般分为以下几个步骤

2020-05-13 08:51:31

【设计技巧】LabVIEW程序设计模式(一)

从LabVIEW的中文版帮助文档中接触“程序设计模式”一词的,这个相对学术化的词语是对一系列用于LabVIEW程序设计结构的归纳和总结。在建造房

2019-08-06 08:00:00
7天热门专题 换一换
相关标签