您当前的位置:首页 > 新闻 > 科技

为什么写代码时要有设计模式?

时间:2020-03-11 15:38:03  来源:  作者:
为什么写代码时要有设计模式?

 

前言

设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。

但是,在开篇中,我想要先整体的介绍下设计模式,让大家知道为什么要学习设计模式。

所以这篇文章的主要内容是:

  • 我对设计模式的理解
  • 设计模式的至高目标:解耦(高内聚低耦合)
  • 设计模式的分类
  • 设计模式遵循的设计原则
  • 为什么我写代码常常用不到设计模式?

文章会逐步更新于我的各个博客上(见文章尾部介绍),也希望各位观众老爷能够关注我的个人公众号:后端技术漫谈,所有文章都会在上面发布,不会错过精彩好看的文章。

为什么我们需要设计模式?

我对设计模式的理解

当我刚刚接触程序,最初听到“设计模式”这四个字的时候,我常常会思考一个问题,这个东西为什么这么拗口。就像我当初听到“离散数学”,“具体数学”一样,有种摸不着头脑的感觉。

带着这种疑问,我尝试看了几篇介绍设计模式的文章,它们都对设计模式进行了这样的介绍:

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

看完之后,我更加摸不着头脑了。看着什么单例模式,责任链模式的代码,感觉老师从来就没提过这些,为什么要把代码写成这样,好好的写完自己想要的功能不就好了嘛???

是的,设计模式,对于入门程序员来说,确实有点空中楼阁,尤其是对于没接触过大型项目的人而言,这些代码是如此的陌生,甚至有点“故弄玄虚”。

但是,生活往往就是有这么多“但是”!当你逐渐入门了程序编写,接触到了大型的,功能复杂的,需要多人合作的代码后,再回头看设计模式,往往就有了越来越清晰的认识。

随着我的经验积累,再回来复习设计模式,常常有醒悟的感觉。接下来就说说我对设计模式的认知:

设计模式的英文是什么?Design pattern,这是一个非常之准确的词汇,个人认为比中文翻译好太多了。

Patten中文释义:. n. 模式;图案;样品. vt. 模仿

pattern往往意味着是一种既定的准则,从它的动词可以看到,他有模仿的意思,也就是说,这样的代码设计,是一系列前人留下的经验,只要跟着这样写代码,往往能够让你的代码,更加简洁,更加健壮,更加优雅!

我觉得他应该有个意译的名字,叫做:代码设计的最佳实践!

是不是很耳熟,还记得最近很火的《阿里巴巴JAVA开发手册》,以及经典的《Effective Java》吗?他们都是属于经验总结型的知识,目的是帮助程序员写出更优雅的代码!

如果你没听过上面的几本书,没关系,当然,你也可以看看我之前的文章 《阿里巴巴Java开发手册》阅读笔记,大概了解下他们的内容是什么样的,你就会理解我说的“他们是一个类型的”。

高内聚低耦合

设计模式是一种代码设计思路,其最最本质的目的是为了解耦,延伸一点的话,还有为了可扩展性和健壮性,但是这都是建立在解耦的基础之上。

有同学要问了,“解耦”是什么意思呢?请先看下面两个概念:

高内聚

系统中A、B两个模块进行交互,如果修改了A模块,不影响模块B的工作,那么认为A是高度内聚的。

为什么写代码时要有设计模式?

 

低耦合

那么当B发生改变时,A模块仍然可以正常工作,那么就认为A与B是低耦合的。

为什么写代码时要有设计模式?

 

所以解耦,本质上就是让不同的代码块各司其职,互不干扰!

设计模式的分类

创建型模式

创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关系创建对象过程中的逻辑。

  • 简单工厂模式(Simple Factory):简单工厂模式不是GoF总结出来的23种设计模式之一
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 创建者模式(Builder)
  • 原型模式(Prototype)
  • 单例模式(Singleton)

结构型模式

结构型模式是为解决怎样组装现有的类,设计它们的交互方式。例如:扩展性(外观、组成、代理、装饰)、封装(适配器、桥接)。因为如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。

  • 外观模式/门面模式(Facade门面模式)
  • 适配器模式(Adapter)
  • 代理模式(Proxy)
  • 装饰模式(Decorator)
  • 桥梁模式/桥接模式(Bridge)
  • 组合模式(Composite)
  • 享元模式(Flyweight)

行为型模式

行为模式刻划了在程序运行时难以跟踪的复杂的控制流,进一步可分为行为类模式和行为对象模式。

行为类模式使用继承机制在类间分派行为。

行为对象模式使用对象聚合来分配行为。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任何一个对象都无法单独完成的任务。

  • 模板方法模式(Template Method)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 职责链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 访问者模式(Visitor)
  • 调停者模式(Mediator)
  • 备忘录模式(Memento)
  • 迭代器模式(Iterator)
  • 解释器模式(Interpreter)

三者之间的区别和联系

创建型模式提供生存环境,结构型模式提供生存理由,行为型模式提供如何生存。

创建型模式为其他两种模式使用提供了环境。

结构型模式侧重于接口的使用,它做的一切工作都是对象或是类之间的交互,提供一个门。

行为型模式顾名思义,侧重于具体行为,所以概念中才会出现职责分配和算法通信等内容。

设计原则

设计模式是优雅的代码实现,所以会讲究标准的设计原则,常用的设计原则如下:

  • 开闭原则: 对扩展开放,对修改关闭
  • 里氏转换原则: 子类继承父类,单独完全可以运行
  • 依赖倒转原则: 引用一个对象,如果这个对象有底层类型,直接引用底层类型
  • 接口隔离原则: 每一个接口应该是一种角色
  • 合成/聚合复用原则: 新的对象应使用一些已有的对象,使之成为新对象的一部分
  • 迪米特原则: 一个对象应对其他对象有尽可能少的了解

为什么我写代码常常用不到设计模式?

这一点,是我临时加上的,因为我之前也有这样的困惑。看了这么多设计模式,为什么我日常使用中根本就不会想到去用呢?我想给出几点回答:

第一,我们日常开发中,经常是使用框架在构造大型的项目,框架已经为我们考虑到了太多的设计,已经让我们开箱即用。所以我们常常只需要CRUD(增删改查)。其实框架的源码中,使用到了非常多的设计模式,这也是为什么很多大牛在推荐我们看某某框架的源码前,常常建议我们先看设计模式。否则看源码的时候,会非常的吃力,因为不知道为什么会这样写代码

第二,设计模式的使用往往在你的编程经验积累到一定程度后,在遇到了大量的问题后,你会想着去进行合理的代码结构设计来解决一些常常会遇到的问题,这时候,你就会慢慢的想到使用设计模式了!所以不要急,你可以先不用强行往自己的项目上放设计模式,但一定要先了解各种设计模式

第三,如果你急着想要上手实践设计模式,那么,做一个完全不依赖大型框架的项目吧,可以是一个工具类,可以是一个小功能脚本,只要不依赖那些复杂的框架,很快你就能发现你代码中可以应用设计模式的地方,别问我怎么知道的,快去自己造一个轮子吧!



Tags:代码   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言几乎所有.NET序列化程序的实现基础都是反射。下列代码是Newtonsoft.Json的实现:protectedvirtualJsonPropertyCreateProperty(MemberInfomember,MemberSerializationmemb...【详细内容】
2021-12-28  Tags: 代码  点击:(2)  评论:(0)  加入收藏
在SEO优化中,最重要的评估之一就是确定网站上存在哪些HTTP状态代码。这些代码可能会变得很复杂,成为一个难题,必须先解决这些难题,然后才能完成其他任务。例如,如果你放置的页面...【详细内容】
2021-12-24  Tags: 代码  点击:(5)  评论:(0)  加入收藏
1、通过条件判断给变量赋值布尔值的正确姿势// badif (a === 'a') { b = true} else { b = false}// goodb = a === 'a'2、在if中判断数组长度不为零...【详细内容】
2021-12-24  Tags: 代码  点击:(6)  评论:(0)  加入收藏
前言本文提供将视频调整分辨率的Python代码,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章: windows ffmpeg安装部署_阿良的博客-CSDN博客ffmpy安装:pip...【详细内容】
2021-12-14  Tags: 代码  点击:(15)  评论:(0)  加入收藏
大家好, 我是林路,今天就给大家介绍Python代码都是用的什么编辑器写的?Jupyter Notebook ,没有Pycharm,没有Vscode,没有Sublime text。 只有一款工具:Jupyter Notebook 。工欲善其...【详细内容】
2021-12-09  Tags: 代码  点击:(27)  评论:(0)  加入收藏
在这篇文章中,我将与你分享一些关于JS的技巧,可以提高你的JS技能。1.避免if过长如果判断值满足多个条件,我们可能会这么写:if (value === 'a' || value === 'b'...【详细内容】
2021-11-17  Tags: 代码  点击:(22)  评论:(0)  加入收藏
一、为什么需要使用内存池在C/C++中我们通常使用malloc,free或new,delete来动态分配内存。一方面,因为这些函数涉及到了系统调用,所以频繁的调用必然会导致程序性能的损耗;另一...【详细内容】
2021-11-17  Tags: 代码  点击:(38)  评论:(0)  加入收藏
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个由百度开源的低代码前端框架——amis...【详细内容】
2021-11-05  Tags: 代码  点击:(68)  评论:(0)  加入收藏
程序员是青春饭,这在国内似乎是公认的。所以很多公司不愿招大龄程序员,很多程序员也“知趣”地及早转型。有的做管理,有的做架构,我还见过改行卖保险的。总之,年龄大了不想敲代码...【详细内容】
2021-10-27  Tags: 代码  点击:(30)  评论:(0)  加入收藏
我们来看看我们拨号键盘除了能打电话还能干什么iphone 的拨号键盘除了用来拨号,其实暗藏代码输入星井06井可以查询手机真实的IMEI码,这个码是独一无二的没有双胞胎 输入星3001...【详细内容】
2021-10-25  Tags: 代码  点击:(78)  评论:(0)  加入收藏
▌简易百科推荐
非法购买公民信息、开发人脸认证规避技术……今年年初,广东省公安厅网安部门侦破全国首例破解“青少年防沉迷系统”的新型网络犯罪案件,抓获犯罪嫌疑人13名,查处非...【详细内容】
2021-12-28    人民日报客户端  Tags:数据安全步   点击:(5)  评论:(0)  加入收藏
就在今天,腾讯方面宣布将在2022年1月31日下架企业QQ和营销QQ,其实这一消息的降临并不让笔者意外,因为早在今年的10月28日20点之后,企业QQ和营销QQ就被停止了续费服务。相信很多...【详细内容】
2021-12-27  科技探险家    Tags:企业QQ   点击:(21)  评论:(0)  加入收藏
日前,上海交通大学发布《全球电竞之都评价报告》,对全球15个致力于发展电竞之都的城市进行评价,上海作为中国城市电竞发展的排头兵,其拥有众多优质电竞企业及完整产业集群,因此排...【详细内容】
2021-12-27  经济日报    Tags:电竞   点击:(3)  评论:(0)  加入收藏
为优化网络氛围环境,微博又开始整顿用户信息了。本月月初,微博官方发布公告,要求昵称中带有如“二货”“SB”“瘪三”“娘炮”等明显低俗或侮辱性词汇的用户尽快修改,否则将面临...【详细内容】
2021-12-24  运了个营    Tags:微博   点击:(10)  评论:(0)  加入收藏
昨日谷歌宣布,自2022年12月19日开始停止对OnHub的软件支持,OnHub路由器仍将提供Wi-Fi信号,但用户无法用谷歌Home应用程序管理它。无法更新Wi-Fi网络设置、添加额外的Wifi设备或...【详细内容】
2021-12-22  雷峰网    Tags:Google OnHub   点击:(5)  评论:(0)  加入收藏
IT之家 12 月 20 日消息,百度网盘青春版 iOS 客户端今日晚间率先开启内测,安卓客户端将在稍后内测。使用苹果 iPhone 的IT之家小伙伴可以点此下载内测版,需要先下载 TestFlight...【详细内容】
2021-12-21  IT之家    Tags:百度网盘   点击:(10)  评论:(0)  加入收藏
对于拼车单,是接还是不接,不少网约车司机表示很矛盾。接吧,钱少事多,常常跑了个寂寞,不接吧,车多客少,挑三拣四没饭吃。 在平台大力推广拼车单之下,不少司机迫于生活压力,最终还是打...【详细内容】
2021-12-17  网约车情报分享    Tags:滴滴   点击:(9)  评论:(0)  加入收藏
蓝鲸TMT频道12月16日讯,据饿了么官方微信公众号,近日,在圆桌会上,蓝骑士与平台交流了配送安全问题。饿了么表示,线上将技术手段融入安全防护;线下将持续进行安全培训,并试点智能头...【详细内容】
2021-12-17    金融界  Tags:饿了么   点击:(24)  评论:(0)  加入收藏
开源最前线(ID:OpenSourceTop) 猿妹编译项目地址: https://github.com/restic/restic全球知名代码托管平台 GitHub 今天就重磅发布了今年的年度报告——《2021 年度 O...【详细内容】
2021-12-17  Python部落    Tags:   点击:(9)  评论:(0)  加入收藏
新京报快讯 据中国网络视听节目服务协会网站消息,12月15日,中国网络视听节目服务协会发布了《网络短视频内容审核标准细则》(2021)。中国网络视听节目服务协会组织有关短视频平...【详细内容】
2021-12-16    新京报  Tags:短视频   点击:(11)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条