「聊设计模式」之 设计模式的前世今生


🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅!


大家下午好,我是bug菌,今天我们继续聊设计模式。

目录:

  • 一、什么是设计模式?
    • 设计模式的定义
    • 设计模式的作用
  • 二、设计模式的发展历程
    • 设计模式的起源
    • 设计模式的发展阶段
  • 三、设计模式的分类
    • 创建型模式
    • 结构型模式
    • 行为型模式
  • 四、常用的设计模式
    • 工厂模式
    • 单例模式
    • 装饰器模式
    • 代理模式
    • 观察者模式
    • 策略模式
    • 模板方法模式
  • 五、设计模式的应用实例
    • 设计模式在软件开发中的应用实例
    • 设计模式在开源框架中的应用实例
  • 六、设计模式的优缺点
    • 设计模式的优点
    • 设计模式的缺点
  • 七、设计模式的未来发展
    • 设计模式的趋势
    • 设计模式的未来发展方向
  • 八、结语
  • ☀️建议/推荐你
  • 📣关于我

一、什么是设计模式?

  设计模式是指在软件开发中常用的一些解决问题的方法和思路。设计模式旨在提高软件系统的可维护性、可扩展性、可重用性和灵活性。本文将介绍设计模式的定义、作用、发展历程、分类、常用的设计模式、应用实例、优缺点、未来发展趋势以及结语。

设计模式的定义

  设计模式是在软件开发中,针对某类问题所提出的最佳解决方案。它描述了在特定环境下,应该采用哪种解决方案来解决该问题,以及如何协调各个类的协同工作。

设计模式的作用

  设计模式可以提高软件系统的可维护性、可扩展性、可重用性和灵活性,同时可以降低软件系统的复杂度和耦合度,提高软件系统的可读性和可理解性。

二、设计模式的发展历程

  设计模式的起源可以追溯到上世纪80年代,GOF(四人帮)在《设计模式:可复用面向对象软件的基础》一书中提出了23种设计模式。设计模式的发展可以分为三个阶段:模式的发现阶段、模式的总结阶段和模式的应用阶段。

设计模式的起源

  设计模式的起源可以追溯到20世纪90年代,由四位著名的软件工程师:艾瑞克·伽玛(Erich Gamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰逊(Ralph Johnson)和约翰·威利斯迪斯(John Vlissides)在他们的著作《设计模式:可复用面向对象软件的基础》中提出。他们在书中总结了自己在软件开发实践中的经验,并将这些经验归纳为23种设计模式,包括创建型模式、结构型模式和行为型模式等。这些模式被视为一种通用解决方案,可以帮助开发人员解决常见的软件开发问题。自此以后,设计模式逐渐成为了软件工程领域中一个非常重要的概念,被广泛应用于开发高质量的软件系统。

设计模式的发展阶段

设计模式的发展可以分为以下阶段:

  1. 原始阶段:20世纪70年代到80年代初期,此时设计模式还未被正式命名。在这个阶段,一些优秀的软件设计师开始尝试将设计经验规范化、提炼出可重用的设计模式。

  2. Gamma等人阶段:20世纪80年代末期到90年代初期,Erich Gamma等人撰写并出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,将设计模式正式命名并形成了23个常用的设计模式。

  3. 设计模式的普及阶段:20世纪90年代中期以后,设计模式逐渐被广泛应用。各种编程语言也相继出现了对设计模式的支持,例如Java中的J2EE和Spring框架。

  4. 模式语言阶段:21世纪初期,有学者开始将设计模式进行分类并形成了一些模式语言,例如企业应用架构模式(Enterprise Application Architecture Patterns)等,这使得设计模式的应用更加灵活和精细。同时,一些新的设计模式也在不断地发掘和提出,例如MVC模式、MVVM模式等。

  5. 应用场景扩展阶段:当前,设计模式已经不再局限于面向对象程序设计领域,还广泛应用于其他领域,例如数据库设计、网络协议设计、机器学习等领域。

三、设计模式的分类

  设计模式可以分为三类:创建型模式、结构型模式和行为型模式。创建型模式主要关注对象的创建过程;结构型模式主要关注对象之间的组织方式;行为型模式主要关注对象之间的交互方式。具体如下:

创建型模式

  关注对象创建机制。主要包括工厂模式、抽象工厂模式、单例模式、建造者模式和原型模式。

结构型模式

  关注类或对象的组合方式。主要包括适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式和代理模式。

行为型模式

  关注对象之间的通信方式。主要包括观察者模式、模板模式、策略模式、责任链模式、命令模式、访问者模式、状态模式、备忘录模式、迭代器模式和中介者模式。

下面用一个图片来整体描述一下设计模式之间的关系:

在这里插入图片描述

四、常用的设计模式

  常用的设计模式包括工厂模式、单例模式、装饰器模式、代理模式、观察者模式、策略模式和模板方法模式等。具体介绍如下:

工厂模式

  工厂模式是一种创建型模式,基于将对象的创建委托给工厂类来实现。它包括简单工厂模式、工厂方法模式和抽象工厂模式等。

单例模式

  单例模式是一种创建型模式,保证一个类仅有一个实例,并提供一个全局访问点。它可以在需要频繁创建和销毁对象的场景中,提高系统性能和减少资源消耗。

装饰器模式

  装饰器模式是一种结构型模式,动态地为对象添加功能。它通过将对象包装在一个装饰器对象中,来使得对象在运行时增加行为,而不是在静态时增加行为。

代理模式

  代理模式是一种结构型模式,为其他对象提供一种代理以控制对这个对象的访问。代理对象在客户端和目标对象之间起到了中介的作用,通过代理对象控制对目标对象的访问,可以给目标对象增加额外的功能,比如权限验证、缓存等。

观察者模式

  观察者模式是一种行为型模式,它定义了一种对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知并自动更新。它可以帮助对象之间更好的交互和协作。

策略模式

  策略模式是一种行为型模式,它定义了一系列算法,把它们一个个封装起来,并使它们可以相互替换。它可以让算法的变化独立于使用它的客户端,从而提高算法的灵活性和复用性。

模板方法模式

  模板方法模式是一种行为型模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。它可以让子类决定一些特定的步骤,从而在不改变算法结构的前提下,定制化算法。

五、设计模式的应用实例

  设计模式在软件开发中有很多应用实例,比如MVC框架、Spring框架、Hibernate框架等。

设计模式在软件开发中的应用实例

  1. 单例模式:在一个系统中,有些对象只需要一个实例,例如配置文件对象或者数据库连接。使用单例模式可以确保只有一个实例被创建和使用。

  2. 工厂模式:当需要创建一些对象时,使用工厂模式可以将创建对象的过程封装起来,使得客户端不需要了解具体的创建细节。

  3. 观察者模式:在某些情况下,需要一些对象能够自动地“观察”和“监听”其他对象的状态变化。使用观察者模式可以确保状态变化被及时地通知到所有依赖这个状态的对象。

  4. 适配器模式:当需要使用一个已有的类,但是这个类的接口不符合当前需求时,可以使用适配器模式将这个类的接口适配到当前需要的接口上。

设计模式在开源框架中的应用实例

设计模式在开源框架中的应用实例有很多,以下是几个常见的应用实例:

  1. Spring框架中的单例模式:Spring框架中的Bean默认采用单例模式,这是通过在Bean的定义中添加一个scope属性来实现的。这样做的好处是可以减少对象创建的开销,提高程序的运行效率。

  2. Struts2框架中的MVC模式:Struts2框架采用MVC模式来实现Web应用程序的开发,这是通过将应用程序分为三层来实现的。其中,Model层负责提供数据,View层负责显示数据,Controller层负责控制数据流向和从View层到Model层的反馈。

  3. Hibernate框架中的DAO模式:Hibernate框架采用DAO模式来实现数据访问,这是通过将数据访问操作封装在一个DAO类中来实现的。这样做的好处是可以减少重复代码,提高程序的可维护性和可扩展性。

  4. Apache Tomcat中的享元模式:Apache Tomcat采用享元模式来管理Servlet实例,这是通过将多个Servlet实例共享一个对象池来实现的。这样做的好处是可以减少对象的创建和销毁开销,提高程序的运行效率。

  5. Netty框架中的责任链模式:Netty框架采用责任链模式来实现网络通信,这是通过将多个处理器串联成一条链来实现的。每个处理器都负责处理特定的请求,如果自己不处理,则将请求转给下一个处理器。这样做的好处是可以将处理复杂请求的代码分解为多个简单的处理器,提高程序的可维护性和可扩展性。

六、设计模式的优缺点

  设计模式的优点是可以提高软件系统的可维护性、可扩展性、可重用性和灵活性,同时可以降低软件系统的复杂度和耦合度,提高软件系统的可读性和可理解性;缺点是设计模式可能会增加代码的复杂度,并且需要牢记所有设计模式的细节和使用场景。

设计模式的优点

设计模式的优点包括:

  1. 提高代码可重用性:设计模式提供了一种可复用的解决方案,可以使相似的问题和需求使用相似的解决方案,从而提高代码的可重用性。

  2. 简化代码维护:设计模式提供了一种标准化的解决方案,使得代码可预测和易于维护。

  3. 提高代码可读性:设计模式提供了一种统一的语言和结构,可以使代码更易于阅读和理解。

  4. 促进代码的松耦合:设计模式通过减少对象之间的依赖关系,使得系统更加灵活、可扩展和易于修改。

  5. 提高系统的可靠性:设计模式经过了反复的实践和验证,可以提高系统的可靠性和稳定性。

  6. 提高开发效率:设计模式可以减少开发人员的思维负担,提高开发效率和代码质量。

设计模式的缺点

设计模式的缺点包括:

  1. 理解和实现难度:设计模式需要掌握一定的理论知识,并要能够将其转化为实际的代码实现。对于初学者来说,学习和应用设计模式需要投入更多的时间和精力。

  2. 增加代码复杂度:在应用设计模式时,需要增加一些类、接口和方法,使得代码可能会变得更加复杂。如果使用不当,还可能会导致代码变得更加难以维护。

  3. 不适合所有情况:设计模式并不是万能的,它们只是在特定情况下发挥最佳效果。如果应用在不恰当的场景中,它们可能会导致代码更加混乱和低效。

  4. 可读性下降:应用设计模式后,代码可能会比较抽象和难以理解。这可能会增加其他开发者在维护代码时的难度。

  5. 过度设计:有时候开发者在应用设计模式时,可能会过度设计。这可能会导致代码变得过于复杂,增加开发时间和成本,也可能会影响代码的性能。

七、设计模式的未来发展

设计模式的趋势

  设计模式是一种被广泛应用的软件开发方法,用于解决各种问题和情况。随着软件行业的快速发展,设计模式也在不断演化和变化,呈现出以下几个趋势,具体如下:

  1. 简化和标准化 - 随着设计模式的不断发展,越来越多的模式被提出,但也意味着需要更多的时间和精力去学习和理解这些模式。因此,设计模式的发展趋势是越来越简化和标准化,让开发人员能够更容易地应用和实现模式。

  2. 增加实际应用 - 虽然许多设计模式在面向对象编程中得到广泛的应用,但在实际应用中,往往需要根据具体情况进行修改和定制。因此,设计模式的发展趋势是为实际应用提供更多的支持和辅助,以便开发人员能够更好地应用和修改模式来满足实际需求。

  3. 跨语言和跨平台 - 随着软件行业的不断发展,开发人员越来越需要在不同的语言和平台之间进行交互和集成。因此,设计模式的发展趋势是支持跨语言和跨平台的应用,以便开发人员能够更轻松地在不同的环境中使用和应用模式。

  4. 强调创新 - 随着软件行业的不断发展,开发人员需要在不断变化的市场环境中保持竞争力。因此,设计模式的发展趋势是支持创新和新型应用,以便开发人员能够更好地应对市场的变化,并提供更高质量的软件产品。

设计模式的未来发展方向

设计模式的未来发展方向有以下几个方面,具体如下:

  1. 面向不同平台和技术的设计模式:随着技术的发展和应用场景的不断变化,未来设计模式将更加注重不同平台和技术的应用,例如云计算、大数据、物联网等领域的设计模式。

  2. 更加注重可重用性和灵活性:未来的设计模式将更加注重可重用性和灵活性。设计模式应该能够在不同的应用场景中重复使用,并能够灵活应对变化的需求。

  3. 更加关注安全性和可靠性:随着网络安全和数据隐私的不断受到威胁,未来的设计模式需要更加关注安全性和可靠性。例如,加密算法、认证授权等设计模式将越来越重要。

  4. 更多地融入人工智能和机器学习:随着人工智能和机器学习技术的发展,未来的设计模式将更多地融入这些技术。例如,智能推荐、数据挖掘等设计模式将成为未来的热点。

  5. 更加注重文档和规范:随着项目复杂度的提高,未来的设计模式将更加注重文档和规范。更加详细的文档和规范将有助于开发人员更好地理解和应用设计模式。

八、结语

  设计模式是软件开发中非常重要的一部分,掌握设计模式能够提高开发效率和软件系统的质量,对于软件开发人员来说是必不可少的技能之一。

文章内容部分参考:
https://www.runoob.com/design-pattern/design-pattern-intro.html

☀️建议/推荐你


  如果想系统性的全面学习设计模式,建议小伙伴们直接毫无顾忌的关注这个专栏《聊设计模式》,无论你是想提升自己的编程技术,还是渴望更好地理解代码背后的设计思想,本专栏都会为你提供实用的知识和启发,帮助你更好地解决日常开发中的挑战,将代码变得更加优雅、灵活和可维护!

📣关于我


我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

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

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

相关文章

服务网格和性能优化:介绍如何通过服务网格提高微服务架构的性能和可扩展性

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

RS485以及MODBUS学习

学习目的: 1、什么是485? 2、485如何通信? 3、如何使用熟能生巧? RS485是一种四总线通信,分别是VCC、GND、485_A、485_B。两根负责通信,两根负责进行供电。 RS485通信 硬件层:解决的是数据传输问…

为什么伦敦金获得连续盈利这么难

相信在伦敦金市场中投资的投资者都有这个感受,我们很容易在市场中获取力量利润,但是要长期的在市场中稳定的盈利,持续不断地获利,这对很多投资者来说都有点难,可以这么说,稳定盈利是普通投资者一个阶段性的…

Spring Boot 各版本的支持时间

1. Spring Boot 各版本的支持时间 Spring Boot 2.7 的版本,支持到2023-11-18,之后就要停止支持了。 按照官网的数据,3.0 的版本也是到2023年11月就停止支持了。如果要转到SpringBoot3,直接从3.1开始吧。到写这篇文章时&#xff…

霍夫曼编码,计算霍夫曼编码树(数字图像处理大题复习 P7)

文章目录 计算出 x1~x6 的树计算 x1~x6 的编码得出霍夫曼编码 w1~w6 计算出 x1~x6 的树 我们先对 x1~x6 进行排序把最底下的加起来,上面写0 下面写1 然后一层一层加上去,注意加上去以后要 重新排序 计算 x1~x6 的编码 举例,从 x5 出发&…

性能测试监控指标及分析调优 | 京东云技术团队一、哪些因素会成为系统的瓶颈?

1. 什么是MAF和MEF? MEF和MEF微软官方介绍:Managed Extensibility Framework (MEF) - .NET Framework | Microsoft Learn MEF是轻量化的插件框架,MAF是复杂的插件框架。 因为MAF有进程隔离和程序域隔离可选。我需要插件进程隔离同时快速传递数据&…

基于Spring Boot的网上购物商城系统

目录 前言 一、技术栈 二、系统功能介绍 用户功能模块的实现 管理员功能模块的实现 商家功能模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上购物商城系统,…

ubuntu、linux in window安装docker教程

1、首先进入管理员权限。 2、更新软件源。 sudo apt update 3、安装一些依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 4、为系统添加Docker的密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-k…

【RabbitMQ实战】docker 安装RabbitMQ(bitnami)

一、搜索镜像 [rootlocalhost ~]# docker search rabbitmq NAME DESCRIPTION STARS OFFICIAL AUTOMATED rabbitmq RabbitMQ is an open source multi-pro…

【论文笔记】Scene as Occupancy

原文链接:https://arxiv.org/abs/2306.02851 1. 引言 与传统的3D框物体表达相比,使用3D占用表达是几何感知的,因为3D框表达简化了物体的形状。此外,现有基于视觉的方法很少考虑时间信息;单阶段方法缺少从粗到细的细化…

建议收藏《Verilog代码规范笔记_华为》(附下载)

华为verilog编程规范是坊间流传出来华为内部的资料,其贴合实际工作需要,是非常宝贵的资料,希望大家善存。至于其介绍,在此不再赘述,大家可看下图详细了解,感兴趣的可私信领取《Verilog代码规范笔记_华为》。…

open62541开发:添加sqlite3 历史数据库

历史数据库在OPCUA 应用中十分重要,例如OPCUA 网关和OPCUA 汇聚服务器中都需要历史数据库功能。但是open62541 协议栈中仅包含了基于内存的历史数据库,在实际应用中是不够的。本博文讨论open62541 中添加sqlite3 为基础的历史数据库若干问题。 借鉴 Gi…

Postman应用——接口请求和响应(Get和Post请求)

文章目录 新增Request请求Get请求Post请求 Request请求响应Postman响应界面说明请求响应另存为示例(模板)Postman显示的响应数据清空请求响应数据保存到本地文件 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范&#…

【Spring Boot】拦截器学习笔记

一、普通拦截器 1,新建类MyWebConfig实现WebMvcConfigurer,实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…

D1117内置热保护和电流限制保护功能,输出电流能力为 1.0A,应用于计算机主板和显卡电源管理等产品上

D1117 是一款低压差线性稳压电路,该电路输出电流能力为 1.0A。该系列电路包含固定输出电压版本和可调输出电压版本, 其输出电压精度为1.5% 。为了保证芯片和电源系统的稳定性,D1117 内置热保护和电流限制保护功能,同时产品采用了…

【前端知识】Three 学习日志(七)—— 动画渲染循环

Three 学习日志(七)—— 动画渲染循环 一、旋转动画 // 渲染函数 function render() {renderer.render(scene, camera); //执行渲染操作mesh.rotateY(0.01);//每次绕y轴旋转0.01弧度requestAnimationFrame(render);//请求再次执行渲染函数render&#…

Microsoft 网络监控

随着网络的发展和变得越来越复杂,公司比以往任何时候都更需要监控其网络基础设施,因为即使是轻微的系统中断也可能导致重大损失。网络监控工具提供实时数据和网络状态的图形概述。这使您能够准确地了解正在发生的事情,以便您知道需要更改的位…

基于Java的公务员考试资料共享平台的设计与实现

前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…

vue管理系统列表行按钮过多, 封装更多组件

管理系统table列表操作列, 随着按钮的数量越来越多会不断加宽操作列, 感觉很不好, 对此我封装了这个自动把多余的按钮放到更多菜单下 MoreOperation/index.vue menu组件我这是ant的, 可以自行替换为其他框架的 <template><div class"table-operations-group"…

CSS 实现祥云纹理背景

&#x1fab4; 背景 最近掘金出来一个中秋创意活动&#xff0c;我准备参加一下。作品方向选择用纯css做一个中秋贺卡&#xff0c;其中有一些中秋的元素和一些简单的动画&#xff0c;而贺卡背景的实现就是本文要讲的内容。 中秋贺卡成果图&#xff08;生成gif有点失真&#x1f6…