设计模式——C++版

开一个新坑……边学习边总结。如有错漏,还望指摘。

什么是设计模式?

设计模式,可以说是个老生常谈的话题了,面试必问,考试必考,敲黑板,送分题。那么什么是设计模式呢?
百度一下:软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
简单说就是:前辈们在解决无数问题后总结出来的“三板斧”。这些设计模式可以解决绝大部分问题的同时,还可以保证代码的可读性、可靠性、重用性、易扩展性、可维护性等等。反正学就完事了嗷。

起源

为了尊重一下前辈,这里还是搬一下设计模式的历史嗷:

1987年,肯特·贝克和沃德·坎宁安利用克里斯托佛·亚历山大在建筑设计领域里的思想开发了设计模式,并把此思想应用在Smalltalk中的图形用户接口的生成中。
一年后Erich Gamma在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。
1994 年, Erich Gamma毕业后与Richard Helm、Ralph Johnson 和 John Vlissides 三人合著出版了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》(中文译名:《设计模式 - 可复用的面向对象软件元素》) 的书,该书首次提到了软件开发中设计模式的概念,并收录了23个设计模式。

四位作者合称 GOF(四人帮,全拼 Gang of Four)。他们所提出的设计模式主要是基于以下的面向对象设计原则。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

六大原则

设计模式为了实现它的易扩展性、可维护性,主要遵循的中心思想就是这六大基本原则:

  1. 开闭原则
    该原则意思是:对扩展开放,对修改关闭。我的理解是,将来当模块需要修改或者升级时,要尽可能做到,不修改现有的功能,而是进行扩展。这主要利用接口类和抽象类实现。当模块进行修改时,只修改实现类或者增加新的接口而不改变原有接口,这样可以最大程度减少对外界的影响,易于维护和升级。
  2. 里氏代换原则
    该原则是说,任何基类可以使用的地方,子类也一定可以使用。该原则是对实现抽象化的具体步骤的规范。我的理解是,子类是对基类的细化、扩充或者实现,而不是改变基类原有的功能或接口。基类是菜,子类就一定是菠菜、油麦菜、小白菜,不能是飞机、大炮。不然买菜的大妈就会一脸懵逼,满脸问号。
  3. 依赖倒转原则
    这个原则是开闭原则的基础,具体内容是针对接口编程,依赖于抽象而不依赖于具体。我的理解是,当你使用某一个类时,尽可能的使用它的父类、接口类,而不是子类、实现类。这样就可以尽可能的解耦合,当该类发生改变时,你受到的影响就会尽可能的小。
  4. 接口隔离原则
    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。这个原则我理解得不是很好,我觉得应该是说,一个接口的功能要尽可能的简单,复杂的功能尽可能用多个简单的接口完成,而不是用一个复杂的接口。
  5. 迪米特法则,又称最少知道原则
    一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。每一个模块要尽可能减少对其他模块的了解,这样就能尽可能的减少对其他模块的依赖。很好理解嘛,知道的越多越容易被灭口。
  6. 合成复用原则
    合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。这同样是为了隐藏实现细节。继承会将部分细节暴露给子类,会使得子类和基类产生一定的耦合。

我翻开《设计模式》一看,这书没有别的,歪歪斜斜的每页上都写着‘六大原则’四个字。我横竖睡不着,仔细看了半夜,才从字缝里看出字来,满本都写着三个字是“解耦合”!
——鲁迅

开个玩笑,其实仔细看这六大原则,全是一个中心思想:解耦合。降低模块之间的耦合,以此降低模块之间的互相影响,以此增加代码的可维护性、可扩展性。

设计模式

这里套用一个随处可见的图片(出处我没有考证……):
在这里插入图片描述

原创文章 34 获赞 41 访问量 5943

猜你喜欢

转载自blog.csdn.net/qq_44844115/article/details/106079535
今日推荐