一文打尽设计模式(C++实现)

https://blog.csdn.net/leacock1991/article/details/111713017

 

点击链接访问具体模式页面

常用模式一览表

其他一些文章
享元模式与单例模式、缓存、对象池的区别
代理、桥接、装饰器、适配器 4 种设计模式的区别

所有示例代码基于C++11开发,IDE为CLion,系统为Ubuntu。
Linux+Window系统安装+CMake+CLion的C++编译环境搭建

我从哪里来(设计模式的由来)

与很多软件工程技术一样,模式起源于建筑领域,

那么模式是如何诞生的?让我们先来认识一个人——Christopher Alexander(克里斯托弗.亚历山大),他有很多头衔,不过他还有一个“昵称”——模式之父(The father of patterns)。Christopher Alexander博士及其研究团队用了约20年的时间,对住宅和周边环境进行了大量的调查研究和资料收集工作,发现人们对舒适住宅和城市环境存在一些共同的认同规律,Christopher Alexander在著作A Pattern Language: Towns, Buildings, Construction中把这些认同规律归纳为253个模式,对每一个模式(Pattern)都从Context(前提条件)、Theme或Problem(目标问题)、 Solution(解决方案)三个方面进行了描述,并给出了从用户需求分析到建筑环境结构设计直至经典实例的过程模型。在他的经典著作《建筑的永恒之道》中,他给出了关于模式的定义:

每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无须再重复相同的工作。

这个定义可以简单地用一句话表示:

模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。【A pattern is a successful or efficient solution to a recurring problem within a context】

1991年,四人组GoF(Gang of Four,Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides)最早将模式应用于软件工程方法学,在1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。

GoF将模式的概念引入软件工程领域,这标志着软件模式的诞生。软件模式(Software Patterns)是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式

软件模式的基础结构主要由四部分构成,包括问题描述【待解决的问题是什么】、前提条件【在何种环境或约束条件下使用】、解法【如何解决】和效果【有哪些优缺点】

我是谁(设计模式是什么)

设计模式的一般定义如下:

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

设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果

  • 模式名称(Pattern Name):通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的;

  • 问题(Problem):描述应该在何时使用模式,包含了设计中存在的问题以及问题存在的原因;(解决了什么问题)

  • 解决方案(Solution):描述一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述;(如何解决的)

  • 效果(Consequences):描述了模式的优缺点以及在使用模式时应权衡的问题。(达到了什么效果)

狭义的设计模式一般分为3大类共计23种(也就是GoF在《设计模式:可复用面向对象软件的基础》一书中所介绍的23种经典设计模式),根据它们的用途,设计模式可分为**创建型(Creational),结构型(Structural)和行为型(Behavioral)**三种。

  • 建型模式主要用于描述如何创建对象
  • 结构型模式主要用于描述如何实现类或对象的组合
  • 行为型模式主要用于描述类或对象怎样交互以及怎样分配职责

我要到哪里去(设计模式的作用)

  • 设计模式是从众多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将避免一些重复性工作,高效设计出高质量的软件系统。

  • 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。

  • 大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写一些重复的代码。

  • 设计模式的使用有助于别人更快地理解系统。

  • 学习设计模式将有助于初学者更加深入地理解面向对象思想。

设计模式要干的事情就是解耦创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦

我该如何做(怎么学习设计模式)

在学习每一个设计模式时至少应该掌握如下几点:

  • 这个设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;(意图、解决问题、何时使用
  • 它是如何解决的,掌握它的结构图,记住它的关键代码;(解决方法、结构、关键代码
  • 能够想到至少两个它的应用实例,一个生活中的,一个软件中的;(示例
  • 这个模式的优缺点是什么,在使用时要注意什么。(优缺点、注意事项

关于设计原则与文章推荐

关于设计原则可以参见 :

【Java设计模式】软件设计七大原则

其他文章推荐:

变化驱动:正交设计

简单设计

小类,大对象

小类,大对象:C++

最后说点啥

学习设计模式不仅仅要学习代码怎么写,更重要的是要了解模式的应用场景,从而理解其背后的设计原则,进一步在日常写代码中按着那些设计原则去编码。

设计原则其实是这些模式背后的东西,设计模式只是设计原则在特定场景下的应用,所谓的 23 个模式其实就是 23 个对设计原则应用的例子,在实际的工作中,更应该按照设计原则去写代码,不一定要强求设计模式,而按照设计原则去写代码的结果,往往是变成了某个模式。

个人能力有限,如有错误之处或者其他建议,敬请告知欢迎探讨,谢谢!

 
posted @ 2023-10-09 14:30  tomato-haha  阅读(20)  评论(0编辑  收藏  举报