软件系统设计 · 必背要点
精简速记版——覆盖架构设计 + 设计模式两大部分的核心定义、原则、模式与考点。
一、面向对象设计原则(7 条)
| # |
原则 |
一句话 |
| SRP |
单一职责原则 |
一个类只负责一件事,仅有一个引起它变化的原因 |
| OCP |
开闭原则 |
对扩展开放,对修改关闭——加新功能不改旧代码 |
| LSP |
里氏代换原则 |
子类必须能透明替换父类,程序行为不变 |
| DIP |
依赖倒转原则 |
依赖抽象(接口),不依赖具体类——面向接口编程 |
| ISP |
接口隔离原则 |
接口要小、要专一,客户端不应依赖它不需要的方法 |
| CRP |
合成复用原则 |
优先使用组合/聚合,尽量少用继承(HAS-A > IS-A) |
| LoD |
迪米特法则 |
最少知识原则——不和陌生人说话,只和朋友通信 |
关系链:目标(OCP)← 指导(LoD)← 基础(SRP)← 实现手段(DIP + CRP + LSP + ISP)
二、设计模式分类速记表
| 目的 \ 范围 |
类模式(继承,静态) |
对象模式(组合,动态) |
| 创建型 |
Factory Method |
Abstract Factory, Builder, Prototype, Singleton |
| 结构型 |
(Class) Adapter |
(Object) Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy |
| 行为型 |
Template Method |
Command, Iterator, Mediator, Observer, State, Strategy |
重点常考模式:Strategy, Observer, Command, Composite, Factory Method, Abstract Factory, Prototype, Flyweight
三、核心设计模式一句话
| 模式 |
一句话 |
关键结构 |
| Strategy(策略) |
封装可互换的算法族,让算法独立于客户端变化 |
Context → Strategy 接口 ← ConcreteStrategy |
| Observer(观察者) |
一对多依赖,Subject 状态变化时自动通知所有 Observer |
Subject → notify() → Observer.update() |
| Command(命令) |
将请求封装为对象,支持撤销、队列、日志 |
Invoker → Command 接口 → Receiver |
| Composite(组合) |
树状结构,统一对待单个对象和组合对象 |
Component 接口 ← Leaf / Composite |
| Factory Method |
定义创建对象接口,子类决定实例化哪个类 |
Creator → factoryMethod() → Product |
| Abstract Factory |
创建一系列相关对象,无需指定具体类 |
AbstractFactory → createA()/createB() |
| Singleton(单例) |
一个类只有一个实例,全局访问点 |
private 构造 + static getInstance() |
| Adapter(适配器) |
将一个接口转换成客户期望的另一个接口 |
Client → Target ← Adapter → Adaptee |
| Decorator(装饰者) |
动态给对象添加职责,比继承更灵活 |
Component ← Decorator → ConcreteComponent |
四、质量属性场景建模(六元组)
Source ──▶ Stimulus ──▶ Artifact ──▶ Environment ──▶ Response ──▶ Measure
(刺激源) (刺激) (工件) (环境) (响应) (响应度量)
| 元素 |
含义 |
示例(Availability) |
| Source |
谁触发 |
心跳监视器 |
| Stimulus |
什么事件 |
服务器无响应 |
| Artifact |
影响什么 |
监视器进程 |
| Environment |
什么状况下 |
正常操作 |
| Response |
系统怎么反应 |
通知操作者,继续运行 |
| Measure |
怎么量化 |
没有停机时间 |
常考 QA:Availability, Performance, Modifiability, Security, Interoperability, Testability, Usability
五、可用性公式(必考计算)
\[
\text{Availability} = \frac{\text{MTBF}}{\text{MTBF} + \text{MTTR}}
\]
| 缩写 |
全称 |
含义 |
| MTBF |
Mean Time Between Failures |
平均无故障时间 |
| MTTR |
Mean Time To Repair |
平均修复时间 |
| SLA |
年停机时间 |
| 99%(两个9) |
~3.65 天 |
| 99.9%(三个9) |
~8.76 小时 |
| 99.99%(四个9) |
~52.6 分钟 |
| 99.999%(五个9) |
~5.26 分钟 |
六、4+1 视图
| 视图 |
关注点 |
受众 |
| Logical(逻辑) |
功能需求,元素及其关系 |
最终用户 |
| Process(过程) |
并发、同步、交互 |
系统集成者 |
| Development(开发) |
代码组织、模块划分 |
程序员 |
| Physical(物理) |
硬件部署拓扑 |
系统工程师 |
| +1 Scenarios(场景) |
用例驱动,验证架构 |
所有利益相关者 |
为什么需要多视图:不同视图支持不同目标/用户;不同视图暴露不同质量属性;单一视图无法描述全部架构。
七、架构风格三分类 + 连线
| 风格类别 |
关注点 |
四种样式 |
| Module Style |
代码/模块组织(静态) |
Decomposition, Uses, Layered, Generalization |
| C&C Style |
运行时组件交互(动态) |
Client-Server, Pipe-Filter, Publish-Subscribe, Peer-to-Peer |
| Allocation Style |
物理部署映射 |
Deployment, Install, Work Assignment, Implementation |
Layered vs Multi-tier:Layered 是 Module Style(逻辑分层),Multi-tier 是 Allocation Style(物理部署分层)。
八、架构演进六阶段速记
主机/终端 → C/S → 三层/分层 → SOA → 微服务 → 事件驱动/云原生
| 架构 |
核心在组织什么 |
优先保障 |
牺牲 |
| 主机/终端 |
核心事务(集中式) |
一致性、安全 |
易用性、灵活性 |
| C/S |
交互能力(UI → 客户端) |
易用性、响应性 |
可部署性、版本治理 |
| 三层/分层 |
职责边界(表示/业务/数据分离) |
可维护性、可修改性 |
极致性能、跨系统复用 |
| SOA |
企业服务能力(服务契约复用) |
互操作、可复用 |
简单性、响应性能 |
| 微服务 |
独立演进单元(按业务拆分) |
可部署、可扩展 |
强一致性、运维简单性 |
| 事件/云原生 |
运行时协作(异步事件+平台) |
弹性、自动化 |
可调试性、时序可预测 |
迁移逻辑:规模↑ → 复杂度↑ → 旧模式擅长解决的矛盾不再是最主要的矛盾。
九、ASR + 效用树
ASR(架构攸关需求):对架构设计决策产生深远影响的需求。
四种提取方法:
1. 需求文档(MoSCoW + User Stories)
2. 质量属性工作坊(QAW,采访涉众)
3. 业务目标分析
4. 效用树(Utility Tree):按 Importance × Difficulty 对场景排序 $\((\text{High, High})\)$ → ASR
十、通用设计策略(6 种)
| 策略 |
说明 |
| Decomposition |
分解系统为更小模块 |
| Abstraction |
关注结构,忽略实现 |
| Divide & Conquer |
分而治之,逐模块处理 |
| Generate & Test |
设计→假设→测试验证 |
| Iteration |
迭代增量细化(ADD 核心) |
| Reuse |
重用现有模式/组件 |
十一、ADD 流程(8 步)
1. Review Inputs(确认输入充分)
2. Establish Iteration Goal(选择驱动因素确定本轮目标)
3. Choose Element(s) to Refine(选择要分解的系统元素)
4. Choose Design Concept(s)(选择设计概念:模式/战术/外部组件)
5. Instantiate Elements, Allocate Responsibilities, Define Interfaces
6. Sketch Views & Record Design Decisions
7. Analyze Current Design & Review Iteration Goal
8. → 回到 Step 2,迭代直到满足所有 ASR
三个迭代阶段:
| Iteration 1 | 建立初始总体结构(Tiers, Deployment Patterns) |
| Iteration 2 | 识别支持主要功能的结构(Patterns, Tactics) |
| Iteration 3..N | 精化,处理剩余驱动因素 |
十二、ATAM 四阶段速记
| 阶段 |
核心输出 |
| Phase 0 准备 |
评估计划(谁、何时、何地) |
| Phase 1 评估 |
架构介绍 + 业务目标 + Utility Tree + 风险/非风险 + 敏感点/权衡点 |
| Phase 2 评估 |
涉众场景优先级 + 风险主题 |
| Phase 3 后续 |
最终评估报告 |
三个关键概念:
| 概念 | 定义 | 示例 |
|------|------|------|
| Risk(风险) | 对 QA 可能有负面影响的决策 | 分层导致性能损耗 |
| Sensitivity Point(敏感点) | 某 QA 对此高度敏感 | 缓存命中率→响应时间 |
| Trade-off Point(权衡点) | 影响多个 QA,互相制约 | 分层:可修改性↑ & 性能↓ |
十三、微服务 vs SOA 对比
| 维度 |
SOA |
微服务(MSA) |
| 通信 |
智能管道(ESB),SOAP/WS-* |
哑管道,REST/gRPC |
| 数据 |
全局数据模型 + 共享数据库 |
每服务独立数据库 |
| 服务规模 |
较大 |
较小 |
| 运维 |
传统部署 |
DevOps 自动化 + API Gateway + 熔断器 |
微服务六大特性:
1. 通过服务组件化
2. 围绕业务能力组织
3. 高内聚、低耦合
4. 去中心化
5. 基础设施自动化
6. 演进式设计
十四、微服务核心模式速记
| 领域 |
模式 |
| 拆分 |
按业务能力拆分、按子域(DDD)拆分 |
| 通信 |
REST/gRPC(同步)、Message Queue(异步) |
| 可靠性 |
Circuit Breaker(断路器) |
| 服务发现 |
Client-side / Server-side Discovery + Service Registry |
| 外部 API |
API Gateway / BFF(Backend for Frontend) |
| 部署 |
Multiple/Service per Host → Service per Container → Serverless |
| 可观测性 |
Health Check API, Log Aggregation, Distributed Tracing, Metrics, Audit Logging |
十五、软件架构核心定义
| 术语 |
一句话 |
| 软件架构 |
系统的一个或多个结构,包括元素、外部可见属性、关系 |
| 架构 = 结构 + 设计决策 |
What(组件-连接器)+ Why(决策理由) |
| Design ⊃ Architecture ⊃ Structure |
设计包含架构,架构包含结构 |
| 软件架构来源 |
NFRs, ASRs, Quality Req., Stakeholders, Organisation, Tech Environment |
| 设计模式 |
被反复使用的、经过分类编目的代码设计经验总结(名称、问题、方案、效果) |
| 大三律(Rule of Three) |
只有经过 ≥3 个不同类型系统的校验,才能从候选模式升格为模式 |
十六、防御式编程关键概念
| 概念 |
说明 |
| 断言(Assertion) |
开发期自检代码,无副作用,对开发者警告 |
| 错误处理(Error Handling) |
运行时处理预期异常 |
| 隔离程序(Barrier) |
安全边界校验,防止错误传播 |
建议配合 review.md(课程复习完整版)和 slides/ 原始课件交叉复习。