热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【设计模式自习室】开篇:为什么要有设计模式?

前言《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。但是,在开篇中,我想要先整体的介绍下设计模式,让大家知道为什么你要学习设计模式。所以这篇文章的主要内容是:我

image.png

前言

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

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

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

  • 我对设计模式的理解

  • 设计模式的至高目标:解耦(高内聚低耦合)

  • 设计模式的分类

  • 设计模式遵循的设计原则

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

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

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

我对设计模式的理解

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

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

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

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

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

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

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

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

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

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

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

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

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

高内聚低耦合

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

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

高内聚

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

image.png

低耦合

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

image.png

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

设计模式的分类

创建型模式

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

  • 简单工厂模式(Simple Factory):简单工厂模式不是GoF总结出来的23种设计模式之一

  • 工厂方法模式(Factory Method)

  • 抽象工厂模式(Abstract Factory)

  • 创建者模式(Builder)

  • 原型模式(Prototype)

  • 单例模式(Singleton)

结构型模式

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

  • 外观模式/门面模式(Facade门面模式)

  • 适配器模式(Adapter)

  • 代理模式(Proxy)

  • 装饰模式(Decorator)

  • 桥梁模式/桥接模式(Bridge)

  • 组合模式(Composite)

  • 享元模式(Flyweight)

行为型模式

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

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

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

  • 模板方法模式(Template Method)

  • 观察者模式(Observer)

  • 状态模式(State)

  • 策略模式(Strategy)

  • 职责链模式(Chain of Responsibility)

  • 命令模式(Command)

  • 访问者模式(Visitor)

  • 调停者模式(Mediator)

  • 备忘录模式(Memento)

  • 迭代器模式(Iterator)

  • 解释器模式(Interpreter)

三者之间的区别和联系

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

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

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

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

设计原则

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

  • 开闭原则:对扩展开放,对修改关闭

  • 里氏转换原则:子类继承父类,单独完全可以运行

  • 依赖倒转原则:引用一个对象,如果这个对象有底层类型,直接引用底层类型

  • 接口隔离原则:每一个接口应该是一种角色

  • 合成/聚合复用原则:新的对象应使用一些已有的对象,使之成为新对象的一部分

  • 迪米特原则:一个对象应对其他对象有尽可能少的了解


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

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


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


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



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


总结

本文概括介绍了下设计模式到底是个什么东西,在接下来的文章中,我们会一个个设计模式来介绍,敬请期待!

参考

https://github.com/CyC2018/CS-Notes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20-%20%E7%94%9F%E6%88%90%E5%99%A8.md

https://github.com/jiayisheji/blog/issues/2

关注我

我是一名后端开发工程师。

主要关注后端开发,数据安全,爬虫,物联网,边缘计算等方向,欢迎交流。

各大平台都可以找到我

  • 微信公众号:后端技术漫谈

  • Github:@qqxx6661

  • CSDN:@Rude3Knife

  • 知乎:@Zhendong

  • 简书:@蛮三刀把刀

  • 掘金:@蛮三刀把刀

原创博客主要内容

  • Java面试知识点复习全手册

  • 设计模式/数据结构 自习室

  • Leetcode/剑指offer 算法题解析

  • SpringBoot/SpringCloud菜鸟入门实战系列

  • 爬虫相关技术文章

  • 后端开发相关技术文章

  • 逸闻趣事/好书分享/个人兴趣

个人公众号:后端技术漫谈

image.png
公众号:后端技术漫谈.jpg

如果文章对你有帮助,不妨收藏,投币,转发,在看起来~




推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudRibbon部分源码相关的知识,希望对你有一定的参考价值。1:ribbon是提供通过servi ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
author-avatar
直属17262676
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有