软件设计模式介绍与入门

news2024/11/28 0:44:09

目录

1、软件设计模式的起源

2、什么是设计模式?

2.1、设计模式的设计意图

2.2、设计模式的分类准则

3、为什么要学习设计模式

4、如何学习设计模式

5、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(正在更新中...)https://blog.csdn.net/chenlycly/category_12279968.html       大家在写代码或阅读代码时,或多或少会涉及到设计模式,设计模式可以从设计的角度帮我们高效地解决某些业务场景下的问题。今天就来聊一下设计模式相关的概述性的内容。

1、软件设计模式的起源

       说到设计模式的起源,就必须要提到一本设计模式经典书籍以及这本书的GOF四人组作者。在上个世纪90年代,准确地说是1995年,由Erich Gamma、Richard Helm、RalphJohnson和John Vlissides合著的《Design Patterns :Elements ofReusable Object-Oriented Software(设计模式:可复用面向对象软件的基础)》一书的出版,正式拉开了软件设计模式的序幕。

       这四位作者常被称为“四人组(Gang of Four, GoF)”,而这本书也就被称为“四人组(或GoF) ”书,所以大家说的设计模式,也被称为GOF设计模式。他们首次总结出一套在软件开发中可以反复使用的经验,帮助我们提高代码的可重用性、系统的可维护性等,帮我们解决软件开发中遇到的复杂问题。这些总结出来的软件设计经验,就是我们讲的软件设计模式,其设计思想适用于多个开发语言。

2、什么是设计模式?

       在软件开发中,经过验证的,用于解决在特定环境下,重复出现的、特定问题的解决方案,这些解决方案就是设计模式。模式就是解决问题的经验和套路,设计模式(Design pattern)就是一套经过前人反复使用,总结出来的程序设计经验。设计模式并不是软件行业特有的,其实很多行业都有自己的设计模式。

       设计模式总共分为三大类:

  • 第一类是创建型模式 ,该模式通常和对象的创建有关,涉及到对象实例化的方式。包括:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式五种;
  • 第二类是结构型模式,结构型模式描述的是如何组合类和对象来获得更大的结构。包括:代理模式、装饰者模式、适配器模式、桥接模式、组合模式、外观模式、享元模式共7种模式。
  • 第三种是行为型模式,用来描述对类或对象怎样交互和怎样分配职责。共有:模板模式、命令模式、责任链模式、策略模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式、迭代器模式11种模式。

2.1、设计模式的设计意图

       23种设计模式都是针对不同的设计应用场景,都有对应的设计意图,如下:

Abstract Factory(抽象工厂模式)提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Adapter(适配器模式)将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge(桥接模式)将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Builder(建造者模式)将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Chain of Responsibility(责任链模式)为解除请求的发送者和接受者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command(命令模式)将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Composite(组合模式)将对象组合成树形结构以表示“部分-整体”的层次结果。Composite使得客户对单个对象和符合对象的使用具有一致性。
Decorator(装饰者模式)动态地给一个对象添加一些额外的职责。就扩展功能而言,Decorator模式比生成子类方式更为灵活。
Facade(外观模式)为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Factory Method(工厂模式)定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method 使一个类的实例化延迟到其子类。
Flyweight(享元模式)运用共享技术有效地支持大量细粒度的对象
Interpreter(解释器模式)给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
Iterator(迭代器模式)提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
Mediator(中介者模式)用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Memento(备忘录模式)在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Observer(观察者模式)定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Prototype(原型模式)用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Proxy(代理模式)为其他对象提供一个代理以控制对这个对象的访问。
Singleton(单例模式)保证一个类仅有一个实例,并提供一个访问它的全局访问点。
State(状态模式)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Strategy(策略模式)定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换本模式使得算法的变化可独立于使用它的客户。
Template Method(模版模式)定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Visitor(访问者模式)表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

2.2、设计模式的分类准则

           设计模式分类依据两条准则,23种设计模式的归类如下图所示:

                              目的
创建型结构型行为型
范围Factory Method(工厂模式)Adapter(适配器模式)

InterPreter(解释器模式)

Template Method(模版模式)

对象

Abstract Factory(抽象工厂模式)

Builder(建造者模式)

Prototype(原型模式)

Singleton(单例模式)

Adapter(适配器模式)

Bridge(桥接模式)

Composite(组合模式)

Decorator(装饰者模式)

Facade(外观模式)

Flyweight(享元模式)

Proxy(代理模式)

Chain of Responsibility(责任链模式)

Command(命令模式)

Iterator(迭代器模式)

Mediator(中介者模式)

Memento(备忘录模式)

Observer(观察者模式)

State(状态模式)

Strategy(策略模式)

Visitor(访问者模式)

        第一是目的准则,即模式是用来完成什么工作的。模式依据其目的可分为创建型、结构型、行为型三种。创建型模式与对象的创建有关;结构型模式处理类或对象的组合;行为型模式对类或对象怎样交互和怎样分配职责进行描述。

        第二是范围准则,指定模式主要是用于类还是用于对象。类模式处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻便确定了下来。对象模式处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。从某种意义上来说,几乎所有模式都使用继承机制,所以“类模式”只指那些集中于处理类间关系的模式,而大部分模式都属于对象模式的范畴。

       创建型类模式将对象的部分创建工作延迟到子类,而创建型对象模式则将它延迟到另一个对象中。结构性类模式使用继承机制来组合类,而结构型对象模式则描述了对象的组装方式。行为型类模式使用继承描述算法和控制流,而行为型对象模式则描述一组对象怎样协作完成单个对象所无法完成的任务。

        还有其他组织模式的方式。有些模式经常会被绑在一起使用,例如,Composite常和Iterator或Visitor一起使用;有些模式是可替代的,例如Prototype常用来替代Abstract Factory;有些模式尽管使用意图不同,但产生的涉及结果是很相似的,例如,Composite和Decorator的结构图是相似的。

3、为什么要学习设计模式

       设计模式是很多前辈经验的积累,是一些典型问题的优秀解决方案。学习设计模式,可以学到前辈们的经验,领会和吸收他们的设计思路,掌握他们解决问题的方法,有效地提升个人技术能力。

1)从宏观的代码视角看

       使用设计模式,可以摒弃一些重复冗繁的操作,写出优雅的代码。使用设计模式,可以更好地重构代码。平时我们写的代码虽然满足了需求,但现有代码可能不方便后期扩展和维护,需要对代码进行重构。很多框架和开源代码可维护性与可扩展性比较好,都在大量使用设计模式

2)从微观的工作学习视角看

       大家在日常软件项目开发过程中会或多或少地使用到一些设计模式,比如单例模式、简单工厂模式、观察者模式等。在笔试面试时,可能也会问道设计模式相关的内容,比如你用过那些设计模式,能不能手写某个设计模式的实现代码等。此外,我们在阅读和学习开源代码时,开源代码中也会大量地使用设计模式。所以学习设计模式是很有必要的,不仅工作中会用到,笔试面试时也可能会涉及到!

        比如我们在IM即时通讯(聊天)软件中,屏幕截图功能已经是标配,需要支持矩形、椭圆、箭头、曲线等图元的绘制,这里使用简单工厂模式很简单,在基类CShape中定义用于图元绘制的纯虚接口Draw,然后在CRectangle(矩形子类)、CEllipsis(椭圆子类)、CCurve(曲线子类)、CLine(箭头类)等子类中去实现具体图元绘制的接口,我们只需要给这些子类设置坐标数据就可以了。相关类图如下所示:

4、如何学习设计模式

       我们要从思想上和方法上吸收设计模式的精髓,将之融入到我们的设计思路中,在进行软件的分析和设计时,能很好的使用这写设计思想去解决问题。

        要真正理解和掌握诸多设计模式,必须要和软件设计实践有效地结合起来,看完后思考,思考后应用,然后再看、再思考、再应用,这是个循环往复的过程。

       学习设计模式的大致流程如下:

  • 1)准确理解每个设计模式的功能、基本结构和标准实现,了解它们的使用场景与使用效果。
  • 2)在实际的软件开发中,尝试着使用这些设计模式,并反复思考这些设计模式是否适用,是否需要做一些改变。
  • 3)有了实际的模式应用经验,再回头去看设计模式的理论,会有不同的感悟和收获,一边看一边结合着应用去思考。比如设计模式的本质是什么?是如何实现的?如何和具体的应用场景结合起来的?这个设计模式的出发点是什么?等等。
  • 4)在实际开中结合理论思考,然后再应用,再思考...如此循环,反复使用,直到能有效地掌握这些设计模式。

总之,在使用设计模式时要理论与实践相结合,理论指导实践,实践反过来加深对理论的理解与认知,如此循环往复,成螺旋式上升。

5、最后

       《重构与模式》一书中有偶一句经典的话:如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧!

       23种设计模式能让你感知到“封装变化、“对象间的松散耦合”、“针对接口编程”的思维,从而设计出易维护、易扩展、易复用、灵活性好的代码。

       此外,大部分设计模式的教材都是使用Java语言来讲解的,很多C++开发人员可能对Java语言不了解,学习起来可能会有些别扭。后续文章中详细讲解的23个设计模式,均采用C++代码实现,方便广大C++开发人员查阅!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

毕业论文写作技巧

毕业论文的组成部分目录自定义目录 摘要(Abstract)绪论相关工作(Related work)研究方法和结果(Method and Results)研究方法研究结果 结论(Conclusion) 写好一篇论文其实就是讲好一个…

批量查询域名历史软件-域名历史快照查询工具

批量查询域名历史和域名历史快照 批量查询域名历史和域名历史快照是一种可以为您提供有关域名历史信息的工具,以下是该主题的详细介绍。 什么是域名历史? 域名历史记录是指域名在被注册前或过去的使用期间所经历的所有事件的记录。这些事件可能包括域…

SpringBoot拦截器获取Request的body数据

1. 场景 自定义Token后,需要在拦截器中进行token验证。在验证的过程中需要读取HttpServletRequest的body部分数据进行验证。 2. 存在问题 如果直接配置拦截器进行urlPatterns拦截,并进行参数验证,在拦截器中获取request的输入流&#xff0c…

智能防盗防偷门锁语音方案设计

智能锁主要功能 防撬报警功能(非必须,但很实用):防撬报警功能可以说是指纹密码锁功能中对提升家居安全有效的功能之一。当指纹锁受到外暴力破坏时,就会自动发出警报声,提醒小区安保。好一点的甚至可以自动…

【AUTOSAR】【以太网】UdpNM

目录 一、概述 二、限制与约束 三、功能说明 3.1 协调算法 3.2 操作模式 3.2.1 Network Mode 3.2.2 准备总线睡眠模式 3.2.3 准备总线睡眠模式 3.3 网络状态 3.4 初始化 3.5 通信调度 3.5.1 NM消息发送 3.5.2 NM消息接收 3.6 其他功能 3.7 帧结构 四、API接口 …

创新案例 | 肆拾玖坊白酒0到20亿增长是传销还是创新

01.背景介绍 中国证券报引用公开数据显示,2016年,规模以上白酒企业数量为1578家,2021年,这一数字下降到965家。 同时,白酒产能逐年向优势产区集中,头部企业市场占有率不断提高。2021年,茅台、…

性能测试-操作和优化分析

打流工具 iperf 测试吞吐率 服务端:iperf -u -s 客户端:iperf -u -c 1.1.1.1 -b 500M -t 10 测试结果 ------------------------------------------------------------ Client connecting to 192.168.56.106, UDP port 5001 Sending 1470 byte d…

全面监测健康数据,更实用的健康手表,dido E55S Pro上手

关心健康的朋友,一般都特别关注自己的各项健康数据,会通过智能手表之类的工具来持续检测。现在健康类的智能手表选择很多,功能也很丰富,像是我现在用的这款dido E55S Pro,除了常规的心率、血氧之外,还检测心…

vector【实现】:迭代器失效以及非法的间接寻址、深拷贝中的浅拷贝。

vector模拟实现_云的小站的博客-CSDN博客 目录 主题: 迭代器失效 Insert导致的迭代器失效 ereas导致的迭代器失效 非法的间接寻址 深拷贝中的浅拷贝。 主题: 1)迭代器失效 2)非法的间接寻址 3)深拷贝中的浅拷…

2023年最佳SleekFlow最佳替代品

建立更强大的对话关系的最佳平台是什么?现如今,国内客服集成与营销自动化工具也有非常多,比如SaleSmartly(ss客服),被称为SleekFlow的最佳替代品。了解为什么SaleSmartly是SleekFlow的最佳替代品。在这篇文…

BTC交易费激增,LTC活跃地址数飙升! BRC-20爆火背后,区块链网络经历了什么?

BRC-20 代币和 Ordinals 协议的日益普及推动了对比特币区块空间的需求,比特币区块链的费用已飙升至两年来的高点。 BRC-20代币标准在 Ordinals 协议上运行。Ordinals 允许用户通过将对数字艺术的引用写入基于比特币的小型交易中,来将数据嵌入比特币区块…

网站历史快照查询软件-批量网站历史快照查询

批量网站历史快照查询软件 批量网站历史快照查询软件是一种可以让用户在短时间内批量查询多个网站历史快照的工具,可以极大地提高用户的工作效率。批量实时查询是该软件的一大优势,下面主要介绍批量实时查询的优势。 一、高效性 批量实时查询可以同时…

通过2种Python库,教会你如何在自动化测试时加入进度条?

前言 我们在执行自动化测试或者调试时,自动化测试用例数量过多,不清楚目前用例数执行了多少个了,还差多少个执行完成。 这时候就会猜想,如果执行过程中存在进度条,就很清楚的了解到测试用例的执行情况,今…

Cannot read properties of null (reading ‘content‘)报错解决

项目是用vue3webpack,始终启动不成功~ 一、问题报错 二、报错解决尝试总结 (1)首先尝试的是因为我近期在做vite3vue3的需求把node版本升到了 16.17.1 猜测是不是node版本影响的 node版本切了14.15.3,16.17.1,以及很…

【换根DP+容斥】P3047 [USACO12FEB]Nearby Cows G

P3047 [USACO12FEB]Nearby Cows G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 思路: 做法就是换根 预处理dp[v][j]用普通的树形DP处理即可 注意:一开始预处理的dp[v][j]指的是在v的子树里离v为j的权值和 Code: #in…

JavaWeb12-三大组件之过滤器-Filter

1. 官方文档 文档:java_ee_api_中英文对照版.chm 2. Filter 过滤器说明 2.1 为啥要过滤器-需求示意图 ● 一图胜千言 2.2 过滤器介绍 Filter 过滤器它是 JavaWeb 的三大组件之一(Servlet 程序、Listener 监听器、Filter 过滤器)Filter 过滤器是 JavaEE 的规范…

图像处理:手写实现图像增广算法(旋转、亮度调整、裁剪与拼接)

前言 图像增广算法在计算机视觉领域扮演着至关重要的角色。随着深度学习的兴起,大规模数据集的需求变得更加迫切,而图像增广算法可以通过对原始图像进行一系列变换,扩充数据集,从而提升模型的泛化能力和鲁棒性。 本文将着重介绍…

win10系统cpu版本 Tensorflow2.5.0的安装

文章目录 前言电脑重装系统了,顺便简单记录一下我的tensorflow2.5.0 CPU的安装过程 一、创建一个虚拟环境?二、确定 输入 y三、激活你的环境四、安装tensorflow2.5.0五、利用清华镜像源加速一下,不然等到猴年马月!六,开…

Shape-E:文字到3D的生成模型试用

文章目录 Shape-E:文字到3D的生成模型试用项目介绍项目地址项目使用试用Text to 3DImage to 3D 总结 Shape-E:文字到3D的生成模型试用 项目介绍 Shape-E是一个生成3D模型的工具,可以通过输入文字或者上传图片生成3D模型。该模型的项目地址是…

穿越火线(CF) AI 自瞄 代码 权重 数据集 亲测可用(结尾有资源)

初衷 本人热衷玩CF,同时为一名程序员,近期听说AI霸占FPS游戏,本着学习的态度,特来测试 不喜欢看过程的小伙伴直接看最下面 模型 采用yolov5模型架构 对过程感兴趣的小伙伴下文自行学习 https://zhuanlan.zhihu.com/p/17212138…