<audio id="audio" title="加餐 | 软件设计文档示例模板" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/59/bb/59a9ea9810eee8a07b7d3166ffef88bb.mp3"></audio>

在[第9篇文章](https://time.geekbang.org/column/article/175529)中，我讲了每种UML模型图的画法，以及这些画法分别适用于什么样的设计阶段，我们也可以将不同阶段输出的模型图放在一个文档中，对每张模型图配以适当的文字说明，构成一篇设计文档。

对于规模不太大的软件系统，我们可以将概要设计文档和详细设计文档合并成一个设计文档。这一篇文章中，我会展现一个设计文档示例模板，你可以参考这个模板编写你的设计文档。

文档开头是设计概述，简单描述业务场景要解决的核心问题领域是什么。至于业务场景，应该在专门的需求文档中描述，但是在设计文档中，必须要再简单描述一下，以保证设计文档的完整性，这样，即使脱离需求文档，阅读者也能理解主要的设计。

此外，在设计概述中，还需要描述设计的非功能约束，比如关于性能、可用性、维护性、安全性，甚至开发和部署成本方面的设计目标。

然后就是具体的设计了，第一张设计图应该是部署图，通过部署图描述系统整个物理模型蓝图，包括未来系统长什么样。

如果系统中包含几个子系统，那么还需要描述子系统间的关系，可以通过子系统序列图，子系统活动图进行描述。

子系统内部的最顶层设计就是组件图，描述子系统由哪些组件组成，不同场景中，组件之间的调用序列图是什么样的。

每个组件内部，需要用类图进行建模描述，对于不同场景，用时序图描述类之间的动态调用关系，对于有复杂状态的类，用状态图描述其状态转换。

具体示例模板如下：

## 1 设计概述

……系统是一个……的系统，是公司……战略的核心系统，承担着公司……的目标任务。

### 1.1 功能概述

系统主要功能包括……，使用者包括……。

### 1.2 非功能约束

……系统未来预计一年用户量达到……，日订单量达到……，日PV达到……，图片数量达到 ……。

1. 查询性能目标：平均响应时间&lt;300ms，95%响应时间&lt;500ms，单机TPS&gt;100；
1. 下单性能目标：平均响应时间&lt;800ms，95%响应时间&lt;1000ms，单机TPS&gt;30；
1. ……性能目标：平均响应时间&lt;800ms，95%响应时间&lt;1000ms，单机TPS&gt;30；
1. 系统核心功能可用性目标：&gt;99.97%；
1. 系统安全性目标：系统可拦截…… 、……、……攻击，密码数据散列加密，客户端数据HTTPS加密，外部系统间通信对称加密；
1. 数据持久化目标：&gt;99.99999%。

## 2 系统部署图与整体设计

系统上线时预计部署……台物理机，……个子系统，和公司……系统交互，和外部第三方……个系统交互。

### 2.1 系统部署图

<img src="https://static001.geekbang.org/resource/image/4b/cb/4bb2e603dc9ed6ab9700f29fa5cbb5cb.png" alt=""><br>
子系统1的功能职责为……，部署……台服务器，依赖……和……子系统，实现 ……功能。

子系统2参照子系统1来写。

### 2.2 下单场景子系统序列图

<img src="https://static001.geekbang.org/resource/image/40/ac/4022d74c2923e8bf5adc013788e05fac.png" alt="">

1. 下单时，子系统先发送……消息到子系统3，子系统3需要执行……完成……处理，然后发送……消息到财务系统，消息中包含……数据。
1. 收到……的处理结果……后，子系统1发送……消息到……子系统2……。

### 2.3 退款场景子系统序列图

<img src="https://static001.geekbang.org/resource/image/40/ac/4022d74c2923e8bf5adc013788e05fac.png" alt="">

1. 退款子系统先发送……消息到子系统3，子系统3需要执行……完成……处理，然后发送……消息到财务系统，消息中包含……数据。
1. 收到……的处理结果……后，子系统1发送……消息到……子系统2……。

### 2.4 退款场景子系统活动图

<img src="https://static001.geekbang.org/resource/image/37/e1/375ef48e2f806f42460b1beba71d2ae1.png" alt=""><br>
如图所示：

1. 退款开始时，子系统1处理XXX，然后判断m的状态，如果m为真，请求子系统3处理ZZZ，如果m为假，子系统继续处理ZZZ并结束。
1. 子系统3处理ZZZ后，一方面继续处理XYZ，一方面将……消息发送给财务通进行AAA处理。
1. 子系统在处理完XYZ后，返回子系统继续梳理YYY，然后退款处理结束。

## 3 子系统1设计

子系统1的主要功能职责是……，其中主要包含了……组件。

### 3.1 子系统1组件图

<img src="https://static001.geekbang.org/resource/image/53/51/53440aeb1890d9de2234e7392b7fbc51.png" alt=""><br>
子系统1包含6个组件：

组件1的功能主要是……，需要依赖组件2完成……，是子系统1的核心组件，用户……请求主要通过组件1完成。

同样的，组件2也可以参照组件1来这样写。

#### 3.1.1 场景A组件序列图

<img src="https://static001.geekbang.org/resource/image/15/89/15b121ced550eca4913773fc14dcaf89.png" alt=""><br>
对于场景A，首先组件1收到用户消息CCC，然后组件1调用组件2的XXX方法……。

#### 3.1.2 场景B组件活动图

<img src="https://static001.geekbang.org/resource/image/c3/13/c37566e9d6709b5aa75d9fdb7c1a4513.png" alt=""><br>
在场景B中，首先组件收到……消息，开始处理……，然后判断……，如果为true，那么……，如果为false，那么……。

### 3.2 组件1设计

组件1的主要功能职责是……，其中主要包含了……类。

#### 3.2.1 组件1 类图

<img src="https://static001.geekbang.org/resource/image/e2/4d/e299191932e2f306dceed924b2915b4d.png" alt=""><br>
Class1实现接口Interface1，主要功能是……，Class1聚合了Class2和Class3，共同对外提供……服务，Class1依赖Class4实现……功能，Class4……。

#### 3.2.2 场景A 类序列图

<img src="https://static001.geekbang.org/resource/image/6b/02/6b7c8d72357d1d7a26159a78378ed602.png" alt=""><br>
在场景A中，当外部应用调用类1的create方法时，类1……。

#### 3.2.3 对象1状态图

<img src="https://static001.geekbang.org/resource/image/bc/2e/bc2c158c13cfb129fba57f1b60aadc2e.png" alt=""><br>
对象1运行时有4种状态，初始状态是状态1，当条件1满足是，状态1转换为状态2，当条件3满足时，状态2转换为状态4……。

### 3.3 组件2设计

重复上面的格式。

## 4 子系统2设计

重复上面的格式。
