第一章 设计模式与软件开发思想、编程环境介绍
第一章 设计模式与软件开发思想、编程环境介绍

第一节 设计模式概述
(1)设计模式基本概念
《设计模式 可复用面向对象软件的基础》《Head First设计模式》《大话设计模式》
模式:指事物的标准样式 或者 理解成 针对特定问题的可重用解决方案。
设计模式:Design Pattern
设计模式,是一套被反复使用的代码设计经验的总结,是经过提炼的出色设计方法。
设计模式,是程序员在长期的开发实践中总结出的一套提高开发效率与程序执行效率的编程方法。
设计模式,代表了一些解决常见问题的通用做法,体现着人们尝试解决某些问题时的智慧。所以,它是一种强大的管理复杂度的工具。
设计模式,是在特定问题发生时的可重用解决方案。
一个设计模式用来描述几个模块或类对象之间关系、职责,以及它们之间如何进行分工与合作。一个甚至是几个设计模式共同配合来解决软件设计中面对的实际问题。
设计模式在比编程语言惯用手法更高的层面来描述解决特定类型问题的途径。
设计模式用来描述在软件系统中如何通过管理代码的相互依赖性来管理复杂性。
大型项目中,设计模式保证所设计的模块之间代码的灵活性和可复用性——都需要以增加代码的复杂性为代价。
- 灵活性(可扩展性/低耦合性),人物形象方面的灵活性。
- 修改现有的部分内容不会影响到其他部分内容(影响面尽可能窄或者尽可能将需要修改的代码集中一起,不希望大范围修改代码)。
- 增加新内容的时候尽量少甚至不需要改动系统现有的内容。
- 可复用性:《设计模式 可复用面向对象软件的基础》:可复用,面向对象
- 可复用:可以重复使用,可以到处用(可以被很多地方调用);
- 面向对象:三大特性:封装,继承,多态——《C++新经典:对象模型》
C++支持的编程模型:面向过程,基于对象,面向对象(基于对象的编程模型融入继承性和多态性后形成的),泛型编程。
通常,设计模式指的是面向对象这种编程模型下的设计模式。组合使用各种设计模式来进行面向对象程序设计。
(2)设计模式中的抽象思维
耦合:两个模块相互依赖,修改其中一个模块,那么另外一个也要修改。模块之间相互影响的关系叫做两个模块之间存在耦合关系。
解耦合:通过修改程序代码,切换两个模块之间的依赖关系,对任意一个模块的修改,不会 影响到另外一个模块,就叫做两个模块之间解耦合。
抽象思维强调对象的本质属性,主要应用于一些软件设计中的解耦合过程。
(2.1)抽象思维的概念
能从事物中抽取出或者说提炼出一些本质的,共性的内容,把这些共性的内容组合到一起(封装)。
(2.1.1)都是动物,要吃、喝——抽象出一个动物类,把吃、喝作为动物类的成员函数:
class Animal
{
public:
void eat() //吃
{
//...
}
void drink() //喝
{
}
virtual void YT() = 0 //用途
};
(2.1.2)各自都有不同的特点(不在抽象思维中,不多探讨)
下面两种解决问题复杂性的方法可以借鉴:
- 分解法:把一个复杂的事物分解成若干个比较简单的事物。这样人们更容易理解。
- (b)抽象法:从每个简单的事物中,抽象出本质的内容封装起来:
学习设计模式的过程,是一个不断提高自己抽象思维能力的过程。
(2.2)抽象思维的目的
设计原则:减少代码的重复性,方便代码的扩展性(日后增加新动物品种)
做抽象的原则:把比较稳定的,不怎么变化的内容作为一个模块,单独定义出来。
(2.3)抽象思维的检验
如何检验某种抽象是否做的不错呢?
(2.3.1)项目需求如果发生更改,不更改现有的代码,通过增加新代码应对需求变更。
继承特性,一般用于表达两种意思:(1)抽象机制:抽取出本质的、共性的内容放到基类中;(2)可重用机制:基类中的一些内容,直接拿过来使用。
(2.3.2)类中内容太多时,就要对类进行拆分,不要把毫不相关的内容写到一个类中。
面向对象程序设计原则之一:单一职责原则——一个类只干好一件事,承担好一种责任,不然就会牵扯太多。
(3)学习设计模式普遍存在的问题
学习的共性问题:
-
听得懂但不会用
学习设计模式的有效方法:忘记设计模式,先面对具体要解决的问题。 遇到难题->笨的解决方案(效果不理想)->采用设计模式解决(效果理想)。
-
学完了之后到处滥用
-
设计模式一般用于解决 大型项目 设计时遇到的各种代码问题。 先有问题,才有设计模式。
-
设计项目时遵循的原则:
- b.1)不要过度设计; b.2)设计是很主观的事情,不是一步到位(重构);b.3)不要为了用模式而用模式,往往代码的实用性和易读性更重要。
-
-
c)设计模式无用论
- 几千到几万行代码,不太需要用到设计模式。
- 10-20万行代码,就需要用到设计模式。
- 开发代码中,常常会无意识的用到某种设计模式,只是自己没注意到而已。
(4)设计模式的缺点
优点:灵活性,可复用性
- 增加程序书写的复杂性;
- 增加了学习和理解上的负担;——用户想要一杯茶,就不要为他创建一个能煮沸海洋的系统。
- 设计模式的引入会在一定程度上降低程序的运行效率。
(5)设计模式在实际工作中的应用和学习方法
-
日常工作中的小项目:用到设计模式的机会不多:项目规模偏小;项目的逻辑功能比较单一;也可能会无意中用到设计模式。
-
大型应用项目和框架类项目 :ACE框架:框架可以理解成多种设计模式的综合运用所生成的半成品。
这里是设计模式发挥重要作用的舞台。
学习设计模式的步骤和方法:
-
掌握设计模式的基本概念和该设计模式要解决的具体问题。
-
动手实际编写相关的测试代码并进一步体验该模式的工作过程。一定不要略过这步。
-
编码过程中不断思考和总结设计经验,对于设计不合理的部分及时调整和更改。
-
在实际的项目中,细致大胆的采用设计模式进行实战,尤其注意多个设计模式解决问题时模式之间的关联和配合,不要怕出错。
(6)学习设计模式的态度、方法和课程的特点
(6.1)学习设计模式的态度、方法
软件开发中需求经常变更,或者增加新需求。设计模式能够发挥重要作用的场所往往就是软件开发中经常发生变化的场所。
寻找和总结这种经常发生变化的场所,无疑考验着软件开发人员的能力和智慧,决定着开发人员对设计模式的运用程度。
理解设计模式的工作流程,看得懂该模式对应的源代码仅仅是其一,更重要的是是要理解在何时何地采用何种设计模式开展工作最合适。
(6.2)课程的特点
-
概念力求简单,出现生涩词汇,都会详细解释。
-
摆脱以往枯燥介绍设计模式的讲解方法,以实际游戏案例贯穿课程来件。
需要设计模式本身不是这门课程的主要目的,让大家学会在哪些场合下选择使用哪种设计模式才是这门课程的宗旨。
-
设计模式,独立于特定编程语言,但设计模式总归 要通过具体的编程语言来实现。
本门课程指的是 用C++语言来实现各种设计模式。
// MyProject.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
//#include <boost/type_index.hpp>
using namespace std;
//#pragma warning(disable : 4996)
namespace _nmsp1
{
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//程序退出时检测内存泄漏并显示到“输出”窗口
return 0;
}
运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
调试程序: F5 或调试 >“开始调试”菜单
入门使用技巧:
1.使用解决方案资源管理器窗口添加/管理文件
2.使用团队资源管理器窗口连接到源代码管理
3.使用输出窗口查看生成输出和其他消息
4.错误列表窗口查看错误
5.转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
6.将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
总结:
- 设计模式,是一套被反复使用的代码设计经验的总结,是经过提炼的出色设计方法。
- 设计模式,是程序员在长期的开发实践中总结出的一套提高开发效率与程序执行效率的编程方法。
- 设计模式,代表了一些解决常见问题的通用做法,体现着人们尝试解决某些问题时的智慧。所以,它是一种强大的管理复杂度的工具。
- 设计模式,是在特定问题发生时的可重用解决方案。
- 一个设计模式用来描述几个模块或类对象之间关系、职责,以及它们之间如何进行分工与合作。一个甚至是几个设计模式共同配合来解决软件设计中面对的实际问题。
- 设计模式在比编程语言惯用手法更高的层面来描述解决特定类型问题的途径。
- 设计模式用来描述在软件系统中如何通过管理代码的相互依赖性来管理复杂性。

第二节 讲解规划与编程环境搭建
(1)软件开发思想、设计模式分类与讲解规划
小型项目,大型项目。
(1.1)大型项目的软件开发思想
-
基本思想
-
前期做细致的需求分析以及架构设计。多花时间书写相关的需求文档,规划设计文档,安排合理的进度。文档应该为未来的项目规模增长提供一定的伸缩性。
-
不要上来就设计类,先划分成各个模块(子系统)。对模块进行明确划分的前提下,再进行类的划分,确定好类的接口。
设计是一个迭代的过程,不可能一蹴而就。
模块之间交互时要限制与当前模块交互的其他模块数量。错综复杂的交互会让设计显得特别凌乱。
-
大型项目的头疼问题:可维护性,可扩展性。尽可能降低模块之间的耦合度(解耦)。
从某种角度来说,学习设计模式的本质就是寻求模块之间的解耦,耦合度越低,就越容易专注解决一小块问题。
-
-
微服务架构的设计模式与设计模式的区别
- 传统开发方式:单体架构(一个单一的可执行程序)。
微服务解决单个一个可执行程序过度复杂,过度庞大的问题,把可执行程序进行拆分,拆分的角度一般是从功能上进行。 - 从功能上,拆分成多个小的程序,彼此之间通过一些架构方式,配合起来共同实现业务需求,如何配合属于微服务架构设计模式研究的领域。
- 单独一个可执行程序都得要写好。
- 同时,并不是所有的业务都能用微服务来解决。
- 本课程所指的设计模式研究探讨的是单独一个可执行程序内部各个模块之间如何做到高灵活性、高可复用性、高可扩展性的问题。
- 传统开发方式:单体架构(一个单一的可执行程序)。
(1.2)设计模式分类、学习要求和讲解规划
-
设计模式分类
常见的设计模式大概有二十多种。通常分为三大类:
- 创建型模式:关注如何创建对象。把对象的创建和使用相分离(解耦)取代传统对象创建方式可能导致的代码修改和维护上的问题。
- 结构型模式:关注对象之间的关系。涉及如何组合各种对象以便获得更加灵活的结构,通过继承以及更多的关系组合以获得更加灵活的程序结构,达到简化涉及的目的。
- 行为型模式:关注对象的行为或者交互方面内容,主要涉及算法和对象之间的职责分配。通过使用对象组合,行为型模式可以描述一组对象如何协作来完成一个整体任务。
-
学习要求和讲解规划
-
学习二十四种(包括三种工厂模式)设计模式。
面对:希望系统学习C++设计模式知识的中高级C++开发者。C++进阶级课程,需要大家对C++开发有比较好的基础。本门课程不需要用到C++11新标准内容,不要求大家掌握C++11新标准。
-
讲解设计模式过程中穿插讲解面向对象程序设计的各个原则。
设计模式需要讲明白两方面知识:(1)某个设计模式对应的代码怎么编写。(2)该设计模式解决了什么样的问题。
-
达到让大家自然而然的知道在什么场合下应该采用哪种设计模式的学习效果。
在设计模式课程中到处讲复杂的实战案例只是听起来不错,但因其固有的复杂性,会对大家造成极大的理解负担,还会喧宾夺主,造成大家案例也没学明白,设计模式也没理解好的负面学习效果。

很多设计模式书籍开始时就讲一堆理论,比如讲一讲UML(统一建模语言),接着讲面向对象程序设计的几大原则。
本课程以实际案例来作为开始,逐步引出各种概念,需要用到UML时再讲UML,需要引出面向对象程序设计原则时再引出。
(2)C++编程环境介绍
(2.1)C++编程环境搭建说明
Windows ->Visual Studio 2019集成开发环境。
(2.2)创建最基本的能运行的C++程序
(2.3)Visual Studio中程序的调试方法
- 普通的断点调试(跟踪调试)
- F9(调试->切换断点)给光标所在行增加断点(设置断点/取消断点)。
- F5(调试->开始调试)用于开始执行程序,遇到第一个断点行就停下来。
- F10(调试->逐过程)
- F11(调试->逐语句):跳到函数中去跟踪执行
- 学会调试时查看内存中的内容
- alt+6(调试->窗口->内存->内存1)
- 快速监视窗口
- shift+F9(调试->快速监视)




参考资料来源:王健伟

浙公网安备 33010602011771号