热门标签 | 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

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




推荐阅读
  • 如何撰写PHP电商项目的实战经验? ... [详细]
  • Hired网站最新发布的开发者调查显示,Python 语言继续受到开发者的广泛欢迎,而 PHP 则被评为最不受欢迎的语言。该报告基于 Hired 数据科学团队对 13 个城市中 9800 名开发者的调查数据,深入分析了当前编程语言的使用趋势和开发者偏好。此外,报告还探讨了其他热门语言如 JavaScript 和 Java 的表现,并提供了对技术招聘市场的洞见。 ... [详细]
  • 【Linux】CentOS 7 远程连接指南:高效安全的远程管理方法
    在 CentOS 7 中实现高效且安全的远程管理,本文详细介绍了如何检查和安装配置 OpenSSH。首先,通过 `yum list installed` 命令检查系统是否已安装 OpenSSH,若未安装,则使用 `yum install openssh-server` 进行安装。随后,配置 SSH 服务以确保其安全性和稳定性,包括修改默认端口、禁用 root 登录等关键步骤。此外,还提供了常见问题的解决方案,帮助用户顺利进行远程连接。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
  • 本文探讨了利用Python编程语言开发自动化脚本来实现文件的全量和增量备份方法。通过详细分析不同备份策略的特点,文章介绍了如何使用Python标准库中的os和shutil模块来高效地管理和执行备份任务。此外,还提供了示例代码和最佳实践,帮助读者快速掌握自动化备份技术,确保数据的安全性和完整性。 ... [详细]
  • Node.js 配置文件管理方法详解与最佳实践
    本文详细介绍了 Node.js 中配置文件管理的方法与最佳实践,涵盖常见的配置文件格式及其优缺点,并提供了多种实用技巧和示例代码,帮助开发者高效地管理和维护项目配置,具有较高的参考价值。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析
    基址获取与驱动开发:内核中提取ntoskrnl模块的基地址方法解析 ... [详细]
  • 在前一篇文章《Hadoop》系列之“踽踽独行”(二)中,我们详细探讨了云计算的核心概念。本章将重点转向物联网技术,全面解析其基本原理、应用场景及未来发展前景。通过深入分析物联网的架构和技术栈,我们将揭示其在智能城市、工业自动化和智能家居等领域的广泛应用潜力。此外,还将讨论物联网面临的挑战,如数据安全和隐私保护等问题,并展望其在未来技术融合中的重要角色。 ... [详细]
  • Python爬虫入门:深入解析HTTP协议与Requests库的应用
    Python爬虫入门:深入解析HTTP协议与Requests库的应用 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • Python网络爬虫入门:利用urllib库进行数据抓取
    Python网络爬虫入门:利用urllib库进行数据抓取在数据科学和Web开发领域,Python凭借其简洁高效的特性成为首选语言。本文主要介绍了如何在Windows环境下使用Python的urllib库进行基本的网络数据抓取。考虑到命令行操作的不便,作者选择了Jupyter Notebook作为开发环境,不仅简化了配置过程,还提供了直观的数据处理和可视化功能。通过实例演示,读者可以轻松掌握urllib的基本用法,为深入学习网络爬虫技术打下坚实基础。 ... [详细]
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社区 版权所有