设计模式课程 第1讲 —— 课程概述

授课教师:王亚沙(北京大学软件研究所,副教授,博士) 课程编号:0C107 来源:田浩然上传的资料 / 0C107设计模式 / ss-01(概述).pdf

一、课程定位

这是一门从 C++ 语言 → 设计原则 → 设计模式 层层递进的软件设计课程,不是孤立地讲模式,而是把设计模式放在软件工程思想的整体框架中理解。

课程强调:编程语言和设计模式都是工具,学习者要作工具的主人——不仅会用,还要理解其内涵、知道其适用边界。

二、课程内容三大模块

1. C++ 语言部分

  • 以 C 语言为基础,通过对比 C 与 C++ 的差异来讲解
  • 不是从零教语法,而是聚焦 C++ 作为面向对象编程语言的核心特征
  • 重点内容:
    • 封装、继承、多态 —— 三大 OOPL 特性的底层实现
    • 常量(const)的使用方法
    • 引用和拷贝构造
  • 背后的软件工程思想:每个语言特征都对应某种设计理念,不是语法糖那么简单

2. 软件设计原则

  • 坏设计的特征:糟糕的软件设计有哪些普遍症状?会带来什么隐患?
  • 好设计的原则:优秀软件设计应遵循哪些基本设计原则?遵循它们的收益是什么?
  • 这是连接语言和模式的桥梁——设计原则是模式背后的”道”,模式是原则在具体场景下的”术”

3. 软件设计模式

设计模式的定义:优秀的软件工程师在工程实践中,为解决某类问题而反复采用的设计方案,是软件设计师工程创新的成果和实践经验的总结。

  • 讲解典型设计模式(后续讲次逐步展开)
  • 重点不是背模式,而是分析模式与设计原则之间的关系
  • 理解了原则,才能灵活运用模式,而不是生搬硬套

三、参考书目

C++ 语言

类型书名作者/译者出版社
主教材《C++ 编程思想》Bruce Eckel 著 / 刘宗田等译机械工业出版社,2000.1
辅助教材《C++ 程序设计教程》钱能等著清华大学出版社,2000.07
辅助教材《Essential C++ 中文版》Stanley B. Lippman 著 / 侯捷译华中科技大学出版社,2001.8

软件设计

类型书名作者/译者出版社
主教材《敏捷软件开发:原则、模式与实践》Robert C. Martin 著 / 邓辉 译清华大学出版社,2003.9
辅助教材《设计模式:可复用面向对象软件的基础》(GoF)Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 著 / 李英军等译机械工业出版社,2005.6

关联笔记:《敏捷软件开发》-原则模式与实践-Robert-C-Martin、《设计模式》-可复用面向对象软件的基础-GoF

四、学习方法论(王亚沙的三条建议)

1. 学而时习之 —— 马背上读兵书

理论与实践迅速结合。

不要先把理论全部学完再动手,而是边学边练,在实践中立刻验证和消化理论。设计模式和编程语言都是实践性极强的知识,光看不写永远学不会。

2. 作主而当家 —— 做工具的主人

编程语言、设计模式都是软件开发的工具,要把自己作为这些工具的主人——不但是应用工具的主人,而且还是制造这些工具的主人。

  • 不断思辨,深入了解工具的内涵
  • 理解为什么要有这个特性/模式,而不只是记住怎么用
  • 只有理解了底层原理和设计意图,才能游刃有余

3. 登堂再入室 —— 从编程到理解计算机

不仅只是学习编程,而且将其作为理解计算机的有效途径。

编程语言和设计模式是理解整个计算机体系的一个入口。从语言特性可以反推编译器、运行时、操作系统的设计;从设计模式可以理解软件架构的演进逻辑和工程权衡。

五、考核方式

  • 作业 50%:2-3 次
  • 考试 50%

(暂定方案)

六、课程全景图(后续讲次关联)

本课程的知识递进关系:

C++ 语言特性(ss-02)
    ↓ 底层机制支撑
设计原则(ss-03)—— SRP / OCP / LSP / DIP / ISP
    ↓ 原则在场景中的具象化
设计模式(ss-04 ~ ss-09)
    ↓ 模式组合运用
综合实例(ss-05 / ss-07)
    ↓ 串讲总结
课程总复习

关联笔记:

七、个人感悟

这门课的独特之处在于不孤立地讲设计模式,而是从语言特性出发,先讲清楚面向对象的底层机制(封装/继承/多态在C++中是怎么实现的),再讲设计原则(为什么要这么设计),最后才讲设计模式(具体场景下的成熟方案)。这种”语言→原则→模式”的三层递进,比直接啃 GoF 那 23 个模式要系统得多。

三条学习建议也很有分量,特别是”作主而当家”——工具是为人服务的,理解其本质才能灵活运用,否则就只是会调用 API 的码农。