第一章:C++与设计模式概述
大家好,我是你们这门课的老朋友。今天咱们聊聊设计模式的入门基础。说实话,我刚开始接触设计模式那会儿,也觉得这东西挺玄乎的。什么「工厂」、「代理」、「观察者」,听着像是一堆黑话。但后来在项目里踩过几次坑,才明白——嗯,这些模式其实就是前人总结出来的「最佳实践」。
这一章,咱们先把地基打牢。我会带你快速回顾一下C++的核心特性,然后讲清楚设计模式到底是个啥,最后再聊聊UML类图——这东西是画给团队看的,也是画给自己理思路的。
1.1 C++语言特性回顾
C++这门语言,说实话,挺「硬核」的。它既有C的底层控制力,又有面向对象的抽象能力。我个人觉得,学好C++的关键,不在于记住多少语法,而在于理解它的「内存模型」和「对象模型」。
咱们挑几个跟设计模式关系最密切的特性来说:
- 封装与访问控制:public、protected、private 这三个关键字,决定了类的接口和实现细节的暴露程度。设计模式里很多「接口隔离」的思想,就靠这个来实现。
- 继承与多态:虚函数、纯虚函数、基类指针指向派生类对象——这是实现「开闭原则」的核心武器。我在项目中见过不少人把继承用成了「代码复用」,其实继承更重要的价值是「行为抽象」。
- 模板与泛型:模板让类型参数化,很多设计模式(比如策略模式、工厂模式)用模板实现后,代码量能减少一半。
- RAII与智能指针:资源获取即初始化,这是C++独有的资源管理哲学。设计模式里涉及对象生命周期管理的地方,都离不开它。
核心观点:设计模式不是C++的专属,但C++的语法特性让很多模式的实现更优雅、更安全。你想想看,如果没有虚函数,多态模式怎么写?如果没有模板,泛型工厂怎么搞?
1.2 设计模式的定义与分类
设计模式,说白了就是「在特定场景下,针对反复出现的问题,给出的可复用的解决方案」。它不是代码库,而是一种「思路模板」。
我记得刚入行那会儿,有个老前辈跟我说:「模式不是让你抄的,是让你悟的。」当时不太理解,后来自己重构过几次代码才明白——模式的价值在于「沟通」和「设计决策」。
GoF(Gang of Four,四人帮)把23种经典模式分成了三大类:
| 分类 | 核心关注点 | 典型模式举例 |
|---|---|---|
| 创建型 | 对象的创建过程 | 单例、工厂、建造者、原型 |
| 结构型 | 类与对象的组合 | 适配器、装饰器、代理、组合 |
| 行为型 | 对象间的职责分配与通信 | 策略、观察者、命令、状态 |
为什么会这样分类?其实很简单:
- 创建型解决的是「谁来创建对象」的问题。比如单例模式,保证一个类只有一个实例。我曾经在一个日志系统里用过单例,结果因为多线程安全问题折腾了两天——嗯,这里要注意,单例不是「随手一写就能用」的。
- 结构型解决的是「如何组合对象」的问题。比如适配器模式,让两个不兼容的接口能一起工作。我做过一个跨平台项目,Windows和Linux的API完全不同,适配器帮了大忙。
- 行为型解决的是「对象之间怎么协作」的问题。比如观察者模式,一个对象状态变了,其他对象自动收到通知。GUI事件系统就是典型的观察者。
个人建议:刚开始学设计模式,别贪多。先搞懂每个模式解决的是什么「痛点」,再去看代码实现。我一般会问自己三个问题:这个模式解决了什么问题?它带来了什么新问题?有没有更简单的替代方案?
1.3 UML类图基础
UML类图,是设计模式的「通用语言」。你想想看,如果团队里每个人对「继承」、「组合」的理解都不一样,那设计文档根本没法看。UML就是用来消除这种歧义的。
我习惯用UML类图做两件事:一是设计阶段画出来理思路,二是代码写完后画出来做文档。别小看这一步,很多设计缺陷在图上就能看出来。
咱们看几个最常用的关系:
- 泛化(继承):空心三角箭头,从子类指向父类。表示「is-a」关系。
- 实现(接口):空心三角虚线箭头,从实现类指向接口。表示「遵循契约」。
- 关联:普通实线箭头。表示「知道对方存在」。比如一个类持有另一个类的指针。
- 聚合:空心菱形箭头。表示「整体-部分」,但部分可以脱离整体存在。比如车队和车。
- 组合:实心菱形箭头。表示「整体-部分」,部分不能脱离整体。比如人和心脏。
- 依赖:虚线箭头。表示「临时使用」。比如函数参数中用到了某个类。
下面这张图,是我用SVG画的一个简单类图示例,展示了「动物」体系中的继承与接口实现关系:
这张图里,IAnimal 是接口,Mammal 是抽象类,Dog 和 Cat 是具体类。注意看箭头方向——都是从子类指向父类,从实现类指向接口。这个方向千万别搞反了,我在Code Review时见过不少新手画反的。
避坑指南:我曾经在一个项目里,把「组合」和「聚合」搞混了。结果设计文档里画的是组合,代码里写的是聚合,导致后来重构时发现对象生命周期管理完全对不上。记住:组合是「同生共死」,聚合是「好聚好散」。
小结
这一章咱们聊了三件事:C++的核心特性、设计模式的分类、UML类图的基本符号。这些东西看起来基础,但说实话,我见过不少工作三五年的工程师,UML类图画得乱七八糟,设计模式用得一塌糊涂。
万丈高楼平地起。后面每一章的模式讲解,都会用到今天这些基础。你如果现在觉得有点模糊,没关系,先有个印象,后面遇到具体模式时再回头翻翻,会更有感觉。
公众号:蓝海资料掘金营,微信deep3321