设计模式学习系列 -- 随记

文章目录

  • 前言

    一、设计模式是什么?

    二、设计模式的历史

    三、为什么以及如何学习设计模式?

    四、关于模式的争议

    一种针对不完善编程语言的蹩脚解决方案 

    低效的解决方案

    不当使用

    五、设计模式分类

    总结


前言

最近可能工作生活上的稳定慢慢感觉自己丢失掉了从前对生活的冲劲,行业的那种压迫感也小了些,没有这些压力好吗?可能也好,但总会有种未雨绸缪的感觉,看到身边的同学朋友继承家业从医从政,相反程序员这个行业可能青春期就那么几年,需要为自己的以后考虑,要看得长久。

可能也需要强迫自己去深入的学习一些知识,形成自己的东西,保持前进的脚步,就从设计模式开始吧...


一、设计模式是什么?

设计模式是软件设计中常见问题的典型解决方案。 它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题。

 设计模式与方法或库的使用方式不同, 你很难直接在自己的程序中套用某个设计模式。 模式并不是一段特定的代码, 而是解决特定问题的一般性概念。 你可以根据模式来实现符合自己程序实际所需的解决方案。

人们常常会混淆模式和算法, 因为两者在概念上都是已知特定问题的典型解决方案。 但算法总是明确定义达成特定目标所需的一系列步骤, 而模式则是对解决方案的更高层次描述。 同一模式在两个不同程序中的实现代码可能会不一样。

算法更像是菜谱: 提供达成目标的明确步骤。 

而模式更像是蓝图: 你可以看到最终的结果和模式的功能, 但需要自己确定实现步骤。

二、设计模式的历史

谁发明了设计模式? 这是一个很好的问题, 但也有点不太准确。 设计模式并不是晦涩的、复杂的概念——事实恰恰相反。 模式是面向对象设计中常见问题的典型解决方案。 同样的解决方案在各种项目中得到了反复使用, 所以最终有人给它们起了名字, 并对其进行了详细描述。 这基本上就是模式被发现的历程了。

模式的概念是由克里斯托佛·亚历山大在其著作 《建筑模式语言》 中首次提出的。 本书介绍了城市设计的 “语言”, 而此类 “语言” 的基本单元就是模式。 模式中可能会包含对窗户应该在多高、 一座建筑应该有多少层以及一片街区应该有多大面积的植被等信息的描述。

埃里希·伽玛、 约翰·弗利赛德斯、 拉尔夫·约翰逊和理查德·赫尔姆这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》 一书, 将设计模式的概念应用到程序开发领域中。 该书提供了 23 个模式来解决面向对象程序设计中的各种问题, 很快便成为了畅销书。 由于书名太长, 人们将其简称为 “四人组 (Gang of Four,GoF) 的书”, 并且很快进一步简化为 “GoF 的书”。

此后, 人们又发现了几十种面向对象的模式。 ​ “模式方法” 开始在其他程序开发领域中流行起来。 如今, 在面向对象设计领域之外, 人们也提出了许多其他的模式。

三、为什么以及如何学习设计模式?

就像是或许你已从事程序开发工作多年, 却完全不知道单例模式是什么。

很多人都是这样。 即便如此, 你可能也在不自知的情况下已经使用过一些设计模式了。

所以为什么不花些时间来更进一步学习它们呢?

设计模式是针对软件设计中常见问题的工具箱, 其中的工具就是各种经过实践验证的解决方案。 即使你从未遇到过这些问题, 了解模式仍然非常有用, 因为它能指导你如何使用面向对象的设计原则来解决各种问题。

设计模式定义了一种让你和团队成员能够更高效沟通的通用语言。 你只需说 “哦, 这里用单例就可以了”, 所有人都会理解这条建议背后的想法。 只要知晓模式及其名称, 你就无需解释什么是单例。

四、关于模式的争议

设计模式自其诞生之初似乎就饱受争议, 所以让我们来看看针对模式的最常见批评吧。

一种针对不完善编程语言的蹩脚解决方案 

通常当所选编程语言或技术缺少必要的抽象功能时, 人们才需要设计模式。 在这种情况下,模式是一种可为语言提供更优功能的蹩脚解决方案。

例如, 策略模式在绝大部分现代编程语言中可以简单地使用匿名 (lambda) 函数来实现。

低效的解决方案

模式试图将已经广泛使用的方式系统化。 许多人会将这样的统一化认为是某种教条, 他们会“全心全意” 地实施这样的模式, 而不会根据项目的实际情况对其进行调整。

不当使用

如果你只有一把铁锤, 那么任何东西看上去都像是钉子。

这个问题常常会给初学模式的人们带来困扰: 在学习了某个模式后, 他们会在所有地方使用该模式, 即便是在较为简单的代码也能胜任的地方也是如此。

五、设计模式分类

不同设计模式的复杂程度、 细节层次以及在整个系统中的应用范围等方面各不相同。 我喜欢将其类比于道路的建造: 如果你希望让十字路口更加安全, 那么可以安装一些交通信号灯,或者修建包含行人地下通道在内的多层互通式立交桥。

最基础的、 底层的模式通常被称为惯用技巧。 这类模式一般只能在一种编程语言中使用。

最通用的、 高层的模式是构架模式。 开发者可以在任何编程语言中使用这类模式。 与其他模式不同, 它们可用于整个应用程序的架构设计。

此外, 所有模式可以根据其意图或目的来分类。 本书覆盖了三种主要的模式类别:

  • 创建型模式提供创建对象的机制, 增加已有代码的灵活性和可复用性。

  • 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。

  • 行为模式负责对象间的高效沟通和职责委派。


总结

学习一个知识点要清楚他的前世今生,为什么出现,解决了什么,要“知其然而知其所以然”。

持续更新...

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

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

相关文章

【轮式平衡机器人】——TMS320F28069片内外设之ePWM

声明:本系列博客参考有关专业书籍,截图均为自己实操,仅供交流学习! 引入 脉冲宽度调制(PWM)是一种对模拟信号进行数字编码的方法,硬件原理是根据相应载荷的变化来调制晶体管栅极或基极的偏置&…

【c++】string模拟实现

string类的接口 namespace zjw {class string{public:typedef char* iterator;typedef const char* const_iterator;private:char* _str;int _size;int _capacity;};这里的迭代器直接使用原生指针来封装。 _str为指向string数组的首地址的指针。 _size为string数组的大小。 …

测试工具使用技巧01-->jmeter链接mysql

前言 在做接口或者性能测试的时候,有时需要jmeter连接数据库做操作,可以看看如下实例。操作实例 在mysql数据库中有如下数据表 在jmeter导入jdbc驱动插件(需要的留言找我拿) 在jmeter测试计划元件最下面,导入jdbc.…

Android平台实现无纸化同屏并推送RTMP或轻量级RTSP服务(毫秒级延迟)

技术背景 在写这篇文章之前,实际上几年之前,我们就有非常稳定的无纸化同屏的模块,本文借demo更新,算是做个新的总结,废话不多说,先看图,本文以Android平台屏幕实时采集推送,Windows…

ActiveRAG—主动学习

原文地址:ActiveRAG — Active Learning 2024 年 2 月 26 日 大型语言模型(LLM)的出现开创了对话式人工智能的新时代。这些模型可以生成非常类似人类的文本,并且比以往更好地进行对话。然而,他们仍然面临着仅仅依靠预先…

面试宝典-【redis】

目录 1.什么是缓存穿透 ? 怎么解决 ? 2.什么是布隆过滤器 3.什么是缓存击穿 ? 怎么解决 ? 4.什么是缓存雪崩 ? 怎么解决 ? 5.redis做为缓存,mysql数据如何与redis进行同步?(双写) 6.排他锁是如何保证读写、读读互斥的呢? 7.你听说过延…

C# LINQ运算符

LINQ运算符 1. 概述1.1 集合->集合1.1.1 筛选运算符1.1.2 映射运算符1.1.3 连接运算符1.1.4 排序运算符1.1.5 分组运算符1.1.6 集合运算符1.1.7 转换方法:Import1.1.8 转换方法:Export 1.2 集合->单个元素或标量值1.2.1 元素运算符1.2.2 聚合方法1.2.3 数量词 1.3 空->…

【MySQL 系列】MySQL 语句篇_DQL 语句

DQL(Data Query Language),即数据查询语言,用来查询数据记录。DQL 基本结构由 SELECT FROM、WHERE、JOIN 等子句构成。 DQL 语句并不会改变数据库,而是让数据库将查询结果发送结果集给客户端,返回的结果是一…

软考72-上午题-【面向对象技术2-UML】-UML中的图3

一、状态图 1-1、状态图的定义 状态图,展现了一个状态机,由:状态、转换、事件和活动组成,是系统的动态视图。 活动(动作) 可以在状态内执行也可以在状态转换(迁移) 时执行。 状态图强调:行为的事件顺序。 1-2、状态图…

SpringBoot项目如何部署到服务器

文章目录 准备:方式一:Jar包方式(推荐)部署步骤: 方式二:War包方式部署步骤: 总结 准备: 云服务器(阿里云、腾讯云等)Linux系统以及运行所需的环境 方式一&a…

力扣--深度优先算法/回溯算法216.组合总和 Ⅲ

思路分析: 深度优先搜索 (DFS): 通过递归实现,尝试从数字 1 到 9 中选择可能的数字,构建和为 n,长度为 k 的组合。递归函数 dfs: 接收参数:result 为最终结果集,path 为当前正在生成…

【C++】二叉树进阶之二叉搜索树

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握二叉搜索树,能自己模拟实现二…

类和对象-继承

师从黑马程序员 基本语法 有些类与类之间存在特殊的关系,例如: 定义这些类时,下一级别的成员除了拥有上一级的共性,还有自己的特性。 这时候我们就可以考虑继承技术,减少重复代码 语法:class 子类&…

加密流量分类torch实践4:TrafficClassificationPandemonium项目更新

加密流量分类torch实践4:TrafficClassificationPandemonium项目更新 更新日志 代码已经推送开源至露露云的github,如果能帮助你,就给鼠鼠点一个star吧!!! 3/10号更新 流量预处理更新 增加了基于splitCa…

misc49

下载附件是个txt文件,打开发现是个压缩包的头 后缀改成zip后打开 base解码无果,我们尝试字母解码 然后音符解码得到 ❀✿✼❇❃❆❇✿❁❇✻✿❀✾✿✻❀❊❆❃❀❊✻❅❀❄✼❂❊❊✾❇❁✽✽✼❁❂❀❀❀❉❃❂❀❉❃❂❊❊✾✼✻✻❀❆✻✻❀❀✻✻✿…

round四舍五入在python2与python3版本间区别

round()方法返回数值的小数点四舍五入到n个数字。 语法 以下是round()方法的语法: round( x ,n) 参数 x --这是一个数值,表示需要格式化的数值 n --这也是一个数值,表示小数点后保留多少位 返回值 该方法返回 数值x 的小数点四舍五入到n个数字 …

使用css结合js实现html文件中的双行混排

此前写过一个使用flex布局实现html文件中的双行混排,但是感觉效果不佳。经过几天思考,我认为双行混排的要点其实是两个: 1、正文和批注的文字大小不同; 2、正文和批注的行距相互配合进行设定。 正文和批注的文字大小及行距都可…

OpenHarmony下musl编译工具链普法

OpenHarmony下musl编译工具链普法 引言 欠的债总是要还的,这不前面欠的关于OpenHarmony下musl相关的还是要还的。这里我对其中的相关知识点,梳理,归纳重新消化下! 一.GCC/Clang/LLVM的区别与联系 说实话,这块我现在都…

当量化私募投资总监能学到什么?

我的情况更新 ​我是美国电子工程背景毕业的。在华尔街第一份实习是在E3做手工t0的proprietary trading,被刷下来之后就一直在帮顶级的对冲基金打杂当助理。所以当初决定回国一展身手,并且写下了破百万阅读的: 在私募做量化研究半年能学到什…

基于神经网络的偏微分方程求解器再度取得突破,北大字节的研究成果入选Nature子刊

目录 一.引言:神经网络与偏微分方程 二.如何基于神经网络求解偏微分方程 1.简要概述 2.基于神经网络求解偏微分方程的三大方向 2.1数据驱动 基于CNN 基于其他网络 2.2物理约束 PINN 基于 PINN 可测量标签数据 2.3物理驱动(纯物理约束) 全连接神经网路(FC-NN) CN…