不同寻常的设计模式

吐血总结《Mysql从入门到入魔》,图文并茂 文章目录1. 查询1.1 查询多列1.2 检索唯一值1.3 限制输出1.4 注释2. ORDER BY 排序2.1 单列排序3.2 多列排序3.3 指定排序方向4. WHERE 过滤数据4.1 WHERE 子句操作符4.2 范围值检查4.3 空值检查5. 高级数据过滤5.1 WHERE 组合过滤5.2 IN 操作符5.3 NOT 操作符6. 通配符过滤6.1 % 通配符6.2 _ 通配符7. 创建计算字段7.1 计算字段7.2 拼接字段7.3 执行算数计算8. 函数8.1 常用文本处理函数8.2 日期和时间 阅读详情

软件行业中几乎在每个公司,我们都会听到一些话题的讨论,我相信关于设计模式的争论绝对是其中之一。你甚至可以找到无数的帖子、文章或者Quora和Stackoverflow上的问题的问答无不是在争论设计模式,前些天我就看到了Quora上一个很古老的问题:“为什么现在程序员很少谈及设计模式?哪些模式(如果有的话)依然还有价值?”显然提问者所说的设计模式是面向对象的设计模式,更确切的说是GoF书中介绍的那23种设计模式,当然大多数回答问题的人也都是这么认为的。

“设计模式”这个术语已然成了“面向对象的设计模式”的代名词,所以当你遇到“设计模式已死”的这种奇怪说法时不要感到震惊。在这篇文章中,我们将重新声明下什么是设计模式,这有助于我们在讨论或使用某种设计模式时,能使我们确定我们究竟在谈论或使用的是什么。

1、设计模式对你意味着什么?

让我们抛开所有的书面上的定义和解释,当提到设计模式这个概念时你首先想到的是什么?一个不该被打破的规则?或是一个字斟句酌的学术建议?亦或是又一个的设计约束?还是说一个你只需要知道就能通过求职面试的法宝?

对我来说,设计模式就像我脑海中的喃喃警语,时刻提醒我不要重复造车轮。你可能有过类似的冲动,当遇到一个问题后就想立即找出应对的解决方案,并开始设计/编写程序——如果是这样的话,那么你也是一个重复造车轮的人。设想一下如果已经有一个现成的解决方案,你再去创造一个到头来只是浪费了不必要的时间和精力。尽管这种冲动可能会随着时间的推移而有所克制,但要完全克服这种冲动情绪,我相信设计模式就是“良药”之一。

许多软件工程师应该都碰到过一个相似的问题,因为某些原因都以某种特定的方式解决了它。上述情况同时也提醒了我,这背后可能隐藏了一个道理,启示我们要从不同角度去看待问题,即使我们很少这么干。让我们看一下GoF的书中介绍的一段:

“我们都知道设计经验的价值,但你又有过多少次那种“似曾相识”的感觉的经历——那种你曾经解决过类似问题,但却不知道在哪以及如何解决的感觉?如果你能记住以前问题的细节以及解决的方法,那么你就可以重新使用这种经验,而不是再次去找解决问题的方案”。

或多或少我们都有过类似的经历:当我们无法记住之前的解决方案时,就会出现反复去解决同一个常见的设计问题的情况。设计模式就是重用解决方案去解决反复出现的问题,从而节省了我们的时间和精力,可以转而去做其他事情。现在,让我们深入探讨一些模式的基本概念和定义。

2、模式意味着什么?

什么是模式?模式的概念并不是软件行业所特有的,其他学科和行业如建筑学、经济学等同样适用。让我们来看下建筑学界权威人士克里斯托弗-亚历山大对模式的定义:

“每种模式都是一个由三部分组成的规则,它描述了某种背景、问题和解决方案之间的关系。”(Alexander, 1979)“每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了解决这个问题的核心。通过这种方式,你就可以无数次地使用这个解决方案,而不是用同样的方式做多次。”(Alexander, 1977)

现在让我们看看模式在软件行业的意义。“软件架构的设计模式描述了在特定的设计环境中反复出现的特定的设计问题,并为其提供了一套可行的通用方案。解决方案是通过描述其组成部件、它们之间责任和关系以及协作方式来指定的。”(BMRSS, 96)

基于上述定义,我们可以将模式视为背景、问题和解决方案三者之间的有机结合。它是一个宽泛的概念,可以应用于不同的规模和抽象层次,从设计整个软件系统到解决特定编程语言的设计问题都可以应用。

3、不同的模式类别

模式是根据其规模和抽象程度来分类的:

(1)架构模式

(2)设计模式

(3)习语
在这里插入图片描述
架构模式关注的是整个软件系统的架构,它的子系统,不同的大组件,以及它们的结合方式。这种模式是一种高层级的抽象,并不关心编程语言是什么,也不关心使用的是什么框架。

“架构模式描述了软件系统的基本结构的组织模式。它提供了一套预定义的子系统,并规定了它们的责任,其中包括组织它们之间关系的规则和指导手册”。(BMRSS, 96)

另一方面,我们在最低的抽象层次上也有一些模式,称之为习语,它涉及到设计和实现。习语是针对特定语言的,也就是说A语言中的习语在B语言中是不相干的。“习语是一种针对特定编程语言的低级模式。习语描述了如何使用给定语言的特性来实现特定方面的组件或组件之间的关系”。(BMRSS, 96)。在上述那些规模和抽象水平的模式之间,还有一些其他的模式,那就是设计模式。

4、设计模式的近距离观察

让我们回顾一下设计模式的定义:“设计模式为完善软件系统的子系统或组件,以及它们之间的关系而提供的一个方案。它描述了一个相互通信的组件的常见结构,用以解决特定的环境中常见的设计问题”。(BMRSS, 96) 。设计模式属于中等规模,这意味着它们既不像架构模式那样高度抽象,也不像习语那样与编程语言耦合。使用设计模式并不影响软件系统的架构,但它会影响子系统的结构及其较小的组件。

现在让我们来讨论下面这句话(摘自同一参考文献),其中包含了关于设计模式的一个重要事实。“它们往往独立于某种特定的编程语言或编程范式”。(BMRSS, 96) 。根据之前在文章中谈到的模式类别,我们重新表述一下:“它们独立于一种特定的编程语言,但往往(不总是)依赖于一种编程范式。”这句话的第一部分很清楚:如果一个模式依赖于特定的编程语言,那么它就属于习语的范畴。关于第二部分,设计模式是为解决编程范式中出现的常见问题而做出的尝试。它们很可能是对范式的缺陷的应对。例如GoF书中描述的23种面向对象的设计模式,其中大部分都不是函数式编程范式中的关注点。反过来也一样,因为设计模式都有不同的背景。正如你在下图中看到的,不同的范式可以共享设计模式,但我们不打算讨论这个话题,因为它超出了本文的范围。

在这里插入图片描述

5、一个著名观点的分析

记住前面的章节,让我们快速浏览一下当你简单地用谷歌搜索设计模式时可能遇到的观点:函数式编程语言不需要设计模式。你可以在这里找到答案,显然这种说法是错误的,因为它暗示设计模式只属于面向对象范式。设计模式是一个在函数式编程范式和面向对象编程范式中都可以存在的概念,设计模式是针对各种范式的问题和需求而设计的。函数式编程范式同样有专门针对其背景的设计模式。此外,正如我们在前几节所讨论的,不同的范式有不同的背景,因此就会遇到不同的问题,我们不应该指望范式B的设计模式来解决范式A的问题。

6、快速回顾

设计模式与其他模式类型类似,试图解决一个特定环境中反复出现的问题。

(1)它们是独立于语言的,但大多是跟范式耦合。

(2)作为中等规模,它们不像架构模式那样抽象。

(3)它们的应用并不影响软件系统的基本架构,但会影响子系统的架构。

(4)最后但也同样重要的是,它们是(所有类型的模式)防止我们重复造轮的手段。

在我看来设计模式并不是约束我们设计的严格规则。它们既不是固定的,也不是无懈可击的,因为它们可以进化,可以变得完善,甚至可以消逝,但模式的概念仍然存在。遵循模式就像是一种思维方式,帮助我们找出可能更好的解决方案。

Chapter 19 Digital Phase-Locked Loops 数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间) 阅读详情

相关推荐

Windows/Mac/Linux三系统保姆级教程:用llama.cpp将safetensors模型转gguf格式(附常见错误解决)

本文提供Windows、Mac和Linux系统下使用llama.cpp将safetensors模型转换为gguf格式的详细教程,涵盖环境配置、转换原理及常见错误解决方案。通过跨平台兼容性处理,帮助开发者高效完成模型格式转换,优化边缘计算性能。

weixin_29227425的博客 271

程序员的五种不同寻常的特质

程序员的五种不同寻常的特质程序员身上有很多特质,用通俗点的话说,是“易黑体质”,但同时优秀程序员也有很多体质。因此,如果你认为自己缺少下面的某些品质,千万别往心里去。不是一时兴起才来探讨这些,其中的很多迹象来自于对其他程序猿的观察或阅读他们的代码。1. 先试试是本能反应编译器和运行环境通常能比人更快地解释一个问题。一个优秀的程序猿在拿着问题去向别人寻求帮助之前,会自己试试看并判断方法是否有用,而不...

weixin_41645721的博客 243

Unity VR 零基础开发之 Pico4 MR

2、弹出弹窗后,点击Android选项,然后再点击Switch Platform按钮切换成安卓平台。3、切换完成后Android选项后面会显示unity图标。

十画的博客 5118

设计模式三 行为型模式

尚学堂视频笔记 行为型模式:关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责 命令、解释、访问者用的较少,共11种 责任链模式:chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象卓哥判断是否有能力处理该请求,如果能处理则处理,如果不能则传递给链上的下一个对象。 比if ...

zx1323的博客 498

用Multisim和74192芯片复刻经典:手把手教你搭建篮球24秒违例计时器(附仿真文件)

本文详细介绍了如何使用Multisim仿真平台和74192芯片构建篮球24秒违例计时器,涵盖时序逻辑电路设计、核心器件选型、仿真环境搭建及调试技巧。通过分步指导,帮助读者掌握数字电路设计的关键技术,并附赠仿真文件供实践参考。

weixin_27014595的博客 279

GD32F103RCT6/GD32F303RCT6(6.2)USART串口实战:从寄存器配置到DMA高效传输

本文详细介绍了GD32F103RCT6和GD32F303RCT6的USART串口通信实战,从寄存器配置到DMA高效传输的全过程。通过具体的代码示例和优化建议,帮助开发者快速掌握串口通信的关键技术,提升嵌入式开发效率。特别强调了DMA在高速数据传输中的优势和应用技巧。

weixin_33725239的博客 309

设计模式之建造模式

一、写在前面的话 其实我也看过很多博主写的设计模式,多多少少的也都忘记了。 今天终于是我自己来写,希望不会那么晦涩生硬的把我想表述的都表达出来。 但愿这是个不同寻常的系列,愿它对你有所帮助。‘ 二、先从一个故事入手吧 有一天,女娲捏泥人捏累了。于是乎,她就找了一个包工头,她告诉包工头说:“你帮我找几个也会捏人的神仙吧,让他们帮帮我”。于是包工头答应了,包工头问女娲,”你这...

HelloWorld! 367

下拉式菜单设计——Power BI

Power BI导航设计:多级下拉菜单

weixin_41542593的博客 5437

二零二二年十二月学习总结

2022年最后一个月过去了,这个月是个不同寻常的月份,这个月大部分人都经历了小阳人的过程,我也不例外,在家里待了大概有10天。虽然损失了一些学习,工作的时间,但是这个月的成长可一点也不少。学生报告版,普通版,后端接口学生普通版,主题讨论数据部分学生报告版,最长上课时长部分教师导出Excel功能新增学号字段调整感觉一个月,忙忙碌碌不知道自己做了什么,当回过头来,再去看,才发现,为什么能够迅速成长。不知不觉,我已经跑了这么远了。

郝老三~~~~~~~~~~~~~ 353

2023华为OD机试真题B卷 Python 实现【最长的元音子串长度】

定义当一个字符串只有元音字母(a,e,i,o,u,A,E,I,O,U)组成,称为元音字符串,现给定一个字符串,请找出其中最长的元音字符串,并返回其长度,如果找不到请返回0, 字符串中任意一个连续字符组成的子序列称为该字符串的子串

MISAYAONE的博客 903

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1847

单例模式

设计模式 单例 ​ 一个类只允许有一个对象,建立一个全局的访问点,提供出去供大家使用。 ​ 好处:可以让两个对象在完全没有关系的前提下,实现值的传递,降低了耦合性,提高了内聚性。 懒汉 public class Singleton { // 将自身实例化对象设置为一个属性,并用static修饰 private static Singleton instance; // 构造...

weixin_43326165的博客 214

用miniconda建立PyTorch、Keras、TensorFlow三个环境

如果还没有安装Miniconda,请从[Miniconda官网](https://docs.conda.io/en/latest/miniconda.html)下载合适的版本并进行安装。如果遇到问题,可以通过编辑`~/.condarc`文件来临时禁用某个源,或者通过`conda config --remove channels`命令来移除配置的镜像源。要切换到不同的环境,先使用`conda deactivate`命令退出当前环境,再用`conda activate 环境名称`命令激活另一个环境。

数字人生 2464

设计模式入门(一):外观模式和适配器模式

最简单的两个模式,同属结构性模式,为啥把他俩放在一起呢?因为他俩实在太像了,并且我也觉得没啥区分的必要。 实际上他俩的实现方式都差不多,通过组合已有类对象来实现。 那么他俩的区别是什么呢?唯一的区别就在于外观模式创建的对象他的接口是供程序员使用的(目的),所以“外观”相较于“被外观的”接口更简单(特征)。而适配器就不一定,他创建的接口不一定会更简单,当时会为了适配已经存在的类使用的接口(目的),...

weixin_43464294的博客 150

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java 单例基类_单例模式 基类泛型

在我们刚学设计模式的时候,单例模式可能是设计模式中最简单最容理解的吧。今天我们就来探究他不一样的风格,不一样的单例模式首先,我们来看一下通俗的单例模式的设计public classPerson{//这里必须要写私有构造函数privatePerson() { }public string Name { get; set; }public string Age { get; set; }private...

weixin_35212670的博客 430

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

一些有意思的文章和资源

又到了向大家介绍一些最近我在网上发现的有价值的东西的时候了。(下面的链接中很多都被墙) 以前向大家介绍过《一些重要的算法》和《算法和数据结构词典》,不过,你知道有些什么样比较奇怪的数据结构吗?wikipedia上的这个词条可以让你看看各种不同的数据结构。比如:Skip

Code-Ninja的专栏 824

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《有理想的程序员必须知道的15件事》有感

看完《有理想的程序员必须知道的15件事》后小有感触,鄙人也有3-4个月没有更新博客了,结合这篇文章总结一下吧。 原文出处:http://www.youkuaiyun.com/article/2011-04-21/296282   1.走一条不一样的路 最近一直也在考虑身为软件开发出身的我的路何去何从,三十而立的我到底应该如何继续走向成功之路。我一直以来还是比较重视自己的职业规划的。从最开始没有一点编程

人件 850

前端Web开发学习,入门到进阶,推荐几本很不错的书籍

大脑渴望新奇,它不断寻找、扫描和等待不同寻常的东西。它天生如此,助你永葆活力。横向发展的同时,纵向发展也很重要。

upgrade_bro的博客 2010

2011总结

                                  2011年总结      很早就想来总结一下,算是对过去一年作回顾。正所谓:有总结才有所得、方可展望。      这个时间段内,经历过很多挫折,主要是来自专业学习、技术深入等。      从专业知识方面来说:      先是学习C,然后是Java,期间反复有C应用,最有确定了专注Java方向。 原因是,作为最流行语言...

129

35岁技术人如何转型做管理?阿里高级算法专家公开10大思考,android设计模式

原创置顶 阿里技术官方号 最后发布于2020-01-17 11:44:33 阅读数 15509 收藏 展开 简介: 35岁左右对工程师而言是个不同寻常的年龄段。技术人有可能面临人生中的转型:从纯技术岗转向管理岗。也将面临诸多新的挑战,关于组建团队、领导以及KPI设置等。本文将讲述阿里资深技术leader张荣从去年1月底接手CRO线NLP算法团队以来,在团队组建、能力建设、以及管理上的一些思考。这些思考从实践中来,总结出一套方法论,希望能给予转型中的技术人一些启发。 张荣,花名威视,现任职阿里巴巴 CRO

m0_64314432的博客 608

【机房重构】总结篇

前言        历时百天的重构终于结束了,还记得当时项目计划的是45天完成,这个效率问题啊...但不得不说,在这百天中,确实收获了很多,和第一次机房收费系统一样,我早于他人开始,晚于他人结束,其中的心理压力很大,但最终还是完整的收官了。

写一封信 1552

2021年Android常见面试题,实战解析

简介 35岁左右对工程师而言是个不同寻常的年龄段。技术人有可能面临人生中的转型:从纯技术岗转向管理岗。也将面临诸多新的挑战,关于组建团队、领导以及KPI设置等。本文将讲述阿里资深技术leader张荣从去年1月底接手CRO线NLP算法团队以来,在团队组建、能力建设、以及管理上的一些思考。这些思考从实践中来,总结出一套方法论,希望能给予转型中的技术人一些启发。 **今天我们要聊到的,是一份内部发布的Android零基础就业宝典,**看完之后或许可以不用再怀疑人生了,学习Android也能如此简单,完美! 下文内

m0_57472099的博客 154

软考总结

历经两个多月的软考结束啦!

不会英语的程序员不是好开拓者 633

2022中级Android开发面试解答,看完就能找到工作

简介 35岁左右对工程师而言是个不同寻常的年龄段。技术人有可能面临人生中的转型:从纯技术岗转向管理岗。也将面临诸多新的挑战,关于组建团队、领导以及KPI设置等。本文将讲述阿里资深技术leader张荣从去年1月底接手CRO线NLP算法团队以来,在团队组建、能力建设、以及管理上的一些思考。这些思考从实践中来,总结出一套方法论,希望能给予转型中的技术人一些启发。 阿里技术一面-35min 自我介绍 Android 有没有遇到OOM问题(有遇到内存泄漏问题) Handler机制 ThreadLocal Activ

m0_66803446的博客 224
上一篇: 项目是否应该开源, 这是一个值得深思的问题
下一篇: “实时数仓”到底是什么?
老贾的AI世界
博客等级 码龄7年 3335粉丝 254原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老贾的AI世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值