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


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


大家下午好,我是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电子书籍、简历模板等海量资料。

相关推荐
腥臭腐朽的日子熠熠生辉23 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian25 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之31 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen1 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存
绝顶少年2 小时前
Spring Boot 注解:深度解析与应用场景
java·spring boot·后端