软考系列之软件设计师:知识点提炼一
本章基于软件设计师考试的相关书籍,记录阅读过程中的知识点。 如有错误,劳请指点。
书籍说明:《软件设计师考试冲刺》(习题与解答) 作者说明: 张友生、王勇
数据结构与算法基础
线性表
又名线性存储结构,将具有“一对一”关系的数据“线性”地存储到物理空间中。
「删除操作」带头结点的线性链表的头指针指向其头结点,而该头结点是不能被删除的,所以头指针的值不需要更改。不带头结点的线性链表在不删除第一个结点后,需要将头指针指向新的第一个结点,而如果删除其他结点,则不需要更改头指针。
顺序表
线性表的一种,全名「顺序存储结构」,将数据依次存储在连续的整块物理空间中。
- 特点:顺序存储,随机存取
- 等概率前提下,删除一个元素平均需要移动(n-1)/2 个元素
链表
线性表的一种,全名「链式存储结构」或单链表,数据分散地存储在物理空间中,通过一根线保存着它们之间的逻辑关系。
- 特点:随机存储,顺序存取
双向链表
具有前指针和后指针,各节点之间的逻辑关系是双向的。
栈
特点:先进后出。
树
二叉树
满二叉树也是完全二叉树,反之不成立。
求叶子结点
某棵度为 T 的树,有 A 度结点 I 个,有 B 度结点 J 个,求树的叶子结点个数。 「公式」(AI+BJ+1)-(I+J)=叶子结点个数。
遍历方式
- 前序遍历(根左右)
- 中序遍历(左根右)
- 后序遍历(左右根)
- 层序遍历(层级)
算法
- 排序算法
- 冒泡排序 重复元素列表,然后依次比较两个相邻的元素,如果顺序错误就交换位置,直到没有相邻元素需要交换。
- 插入排序 将待排序元素插入到已排序的有序表中,从而得到一个新的有序表。
- 归并排序 分治法的思维,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
- 递归算法 分为递推和回归两阶段。
- 分治法
- 动态规划法
- 贪心算法
- 回溯算法
时间复杂度
- 排序查找 O(n)
- 二分法(折半查找) O(log2n)
哈夫曼编码
属于前缀编码,任一字符的编码都不是另一个字符编码的前缀,保证唯一性。
有向图的拓扑排序
找到起点和终点,按照方向遍历有元素进行排序。
广义表
「样式」 Ls=(a1,(a2,a3),…,ai,…,an) 「长度」 n 即长度。 「深度」 嵌套括号的层数,上面样式深度为 2。
程序语言与语言处理程序
程序设计语言
- 命令式 基于动作,例如:Fortran,Pascal,C 语言。 「Fortran」第一个广泛用于科学计算的高级语言,执行效率高。 「Pascal」为了教学目的开发的。 「C 语言」20 世纪 70 年代发展的通用程序设计语言,UNIX 系统以及其中大量的应用程序都是使用此语言编写。
- 函数式 以 λ 演算为基础,主要用于人工智能领域,例如:Lisp,ML。
- 面向对象 核心为对象和类,核心概念是封装,继承和多态,例如:C++,smallTalk,Java,C#。
- 逻辑 以形式逻辑为基础,适用于书写自动定理证明,专家系统和自然语言理解等问题,例如:Prolog。 「Prolog」多用于数据库和专家系统。
注释
-
序言性注释 「位置」程序开头。 「内容」
- 硬件,软件资源的要求
- 重要变量和参数说明
- 作者,审查者,日期
- 功能描述
-
功能性注释 「位置」嵌在源程序序体之中。 「内容」
- 相关语句的作用
- 后续实行的功能
函数调用时的参数传递方式
- 传值调用 过程的形式参数取得的是实在参数的值。
- 引用调用 过程的形式参数取得的是实在参数所在单元的地址。
- 传值-结果调用 初始化时实在参数值被拷贝给形式参数,在过程调用结束时再把形式参数值拷回实在参数。
编译器
「理论」将高级语言源程序翻译成机器语言程序,反编译是编译的逆过程。 「处理过程」词法分析,语法分析,语义分析与中间代码生成,代码优化,目标代码生成。 「注意」其中中间代码生成和代码优化不是每种编译器都必需的。 「反编译」不能把可执行文件还原成高级语言源代码,智能转换成功能上等价的汇编程序。
- 词法分析 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词在词法分析阶段工作所依循的是语言的词法规则。
- 语法分析 把单词符号分解成各类语法单位(短语,句子,子句,程序段)。
- 语义分析与中间代码生成 首先对各种语法范畴进行静态语义检查,然后进行中间代码的翻译。
- 代码优化 对中间代码进行加工,遵循的原则是程序的等价变化规则,例如删除无用代码,循环优化,表达式提炼。
- 目标代码生成 把中间代码变换成特定机器上的低级语言代码。
编译程序和解释程序
- 编译型 源程序翻译成另一种语言,例如:C 语言,C++等
- 解释性 逐句翻译执行,不产生目标代码,例如:BASIC
变量
- 全局变量 又称外部变量,在函数外部定义的变量。
- 局部变量 又称内部变量,在函数体内定义的变量,函数的形参也是一种局部变量。 「注意」局部变量比全局变量具有更高的优先权。
源程序错误类型
- 词法错误 非法字符,拼错关键字,标志符等。
- 语法错误 语法结构错误,少分号,begin 和 end 不匹配等。
- 语义错误
- 静态,类型不一致,参数不匹配等。
- 动态,死循环,变量为 0 作为除数等。
数据具有类型的因素
- 便于系统为程序分配存储空间
- 清楚数据所能表示的数组范围
- 确定数据能参加一些什么样的运算,例如:自加运算就不允许其他操作数为浮点数。
表达式
求一个表达式的前后中缀,先将表达式的逻辑处理成树,加减等符号为结点,数字为子叶,然后按照树的前中后序遍历即可。
操作系统
主要作用
- 向用户提供接口,方便用户使用计算机。
- 管理计算机软硬件资源。
管理功能
- 进程管理
- 存储管理
- 设备管理
- 文件管理
- 作业管理
存储方式
- 连续分区分配给唯一用户作业 不支持多道程序设计。
- 固定分区 支持多道程序设计,算法简单,易产生碎片。
- 可重定位分区 消除存储碎片,紧缩存储空间,加长压缩时长。
- 非请求分页式 不支持虚拟存储,消除存储碎片,紧缩处理时长,支持多道程序设计。
- 请求分页式 支持虚拟存储,消除存储碎片,紧缩处理时长,支持多道程序设计。
- 段页式 支持虚拟存储,可实现动态链接和装配。
进程
「概念」进程是操作系统中可以并发运行和分配系统资源的基本单位。 「组成」从静态的角度看,进程由进程控制块(PCB),程序段和数据空间组成。 「撤销方式」运行的进程会随着作业运行正常或不正常结束而撤销。
三种基本状态
- 就绪状态
- 运行状态
- 挂起状态
状态转换图
处理机的状态
一个单处理机,处于运行态的进程最多只有一个,处于就绪态或者阻塞态有多个。
- 管态(系统态) 处理系统程序,特权和非特权指令
- 非管态(目态或者用户态) 处理一般用户程序,非特权指令
死锁算进程数量
「公式」 K*(M-1)=总资源数,M 指每个进程需要的资源,求 K 即可得到发生死锁的最小值。 「根本原因」 系统提供的资源个数少于并发进程所要求的该类资源数。 「解除死锁的方法」 强行将死锁的程序撤销,资源剥夺法。
进程同步
源于进程合作,是进程共同完成一项任务时,直接发生相互作用的关系,为进程之间的直接制约关系。
进程互斥
源于资源共享,是进程之间的间接制约关系。 「临界资源」,又称独占资源,在一段时间内只允许一个进程访问的资源。
Spooling 系统
「技术」 低速输入输出设备与主机交换的一种技术。 「目的」 提高 I/O 的利用率,使独占设备共享化。
多道程序技术
在内存中同时存放几道相互独立的程序,使他们在管理程序控制之下,相互穿插的运行。
特征
- 多道
- 宏观上并行
- 微观上串行运行
分时操作系统
一台主机连接了若干个终端,每个终端有一个用户在使用。 「时间片」 将 CPU 的时间片划分成若干个片段。 「响应时间」 公式:T=Q*N,T是响应时间,Q 是时间片,N 是用户数。
特征
- 多路性 同时有多个用户使用一台计算机。
- 交互性 用户根据系统响应结果进一步提出新请求。
- “独占”性 用户感受不到计算机为他人服务。
- 及时性 系统对用户提出的请求及时响应。
虚拟内存
利用操作系统本身的一个其容量比贮存大得多的存储器,实际上是一个地址空间。 容量取决于计算机的地址结构和外存容量。
缺页中断率因素
- 分配给作业的主存块数,主存块数越多,中断率越低。
- 页面的大小,页面越大,中断率越低。
- 页面调度算法。
- 作业本身的程序编制方法。
设备与 CPU 之间数据传送控制方式
- 程序直接控制
- 中断控制
- 直接内存访问(DMA)
- 通道控制
当前目录
当前目录使用的是相对路径,方便查找文件,从根目录开始的是绝对路径。
软件工程
特点
- 可测试性 表示测试及验证软件的难易度。
- 可理解性 能够被软件维护人员阅读并理解的方便程度。
- 可靠性 软件按照规定的条件,在规定的时间内运行而不发生故障的能力。
- 可移植性 软件从一个计算机系统或者环境移动到另一个计算机系统或者环境的容易程度。
- 可用性 产品在特定使用环境下为特定用户用于特定用途时所具有的有效性,效率,和用户主观满意度。
- 兼容性 与软件可从某一环境转移到另一个环境的能力有关的一组属性。
- 可修改性 软件能够被软件维护人员修改的方便程度。
- 一致性 软件服从与可移植性有关的标准或者约定的程度。
各个阶段
- 需求分析阶段
- 任务
- 确定软件的综合要求 例如:系统界面,系统功能,系统性能,安全性,保密性和可靠性方面的要求,系统的运行要求,异常处理,将来的扩充和修改。
- 分析软件系统的数据要求 例如:基本数据元素,数据元素之间的逻辑关系,数据量,峰值。
- 导出系统的逻辑模型。
- 修正项目开发计划。
- 软件需求说明书
- 数据描述
- 数据流图
- 数据字典描述
- 系统接口描述
- 内部接口描述
- 系统的功能描述
- 处理说明
- 系统设计的限制系统的性能描述
- 性能参数
- 对系统进行测试的种类
- 任务
- 软件设计
- 编码及单元测试
- 集成及系统测试
- 安装
- 实施与维护
ISO/IEC926 的软件质量模型的特性
- 功能性 合适性,准确性,互操作性,依从性,安全性
- 可靠性 成熟性,容错性,可恢复性
- 可用性 可理解性,易学性,可操作性
- 效率 时间特性,资源特性
- 可维护性 可分析性,可改变性,稳定性,可测试性
- 可移植性 适应性,可安装性,循环性,可替换性
开发模型
- 瀑布模型 适用于需求明确的开发
- 喷泉模型 开发活动交叉、迭代地进行
- 快速原型 适用于需求不明确的开发
- 演化模型 从初步模型逐步演化为最终软件产品的渐进过程
- 螺旋模型 适用于风险较大的大中型开发项目
UP(统一过程)的周期
初始阶段
「主要任务」
- 确定项目范围和边界
- 识别系统的关键用例
- 展示系统的候选框架
- 评估项目费用和时间
- 评估项目风险
「意图」
- 建立项目的范围和版本
- 确定业务实现的可能性和项目目标的稳定性
「提交结果」
- 原始的项目需求和业务用例
精化阶段
「主要任务」
- 分析系统问题领域
- 建立软件架构基础
- 淘汰最高风险元素
「意图」
- 对问题域进行分析
- 建立系统的需求和架构
- 确定技术实现的可行性和系统架构的稳定性
「提交结果」
- 系统架构及其相关文档
- 领域模型
- 修改后的业务用例和整个项目的开发计划
构建阶段
「主要任务」
- 资源管理
- 控制和流程优化
- 开发剩余的构件
- 构件组装和测试
「意图」
- 增量式地开发一个可以条幅用户的软件产品
提交阶段
「主要任务」
- β 测试
- 制作发布版本
- 用户文档定稿
- 确认新系统
- 获取用户反馈
- 培训,调整产品使最终用户可以使用产品
「意图」
- 将软件产品提交用户
新老系统转换方式
- 直接转换 终止老系统,启动新系统。
- 并行转换 新老系统并行一段时间,经过一段时间的考验后,新系统正式代替老系统。
- 分段转换 又名逐步转换,向导转换,试点过度法。直接转换和并行转换的结合。在新系统全部正式运行前,一部分一部分地代替老系统。
CMM 模型成熟度等级
- 初始级
- 可重复级
- 定义级
- 管理级
- 优化级
测试
- 单元测试 在详细设计阶段定制。通常由程序员在编程阶段自测。
- 集成测试 在概要设计阶段定制。主要是对模块组装的而成的程序进行测试。
- 确认测试 在需求分析阶段定制。检查软件的功能,性能以及其他特征是否符合与用户需求一致。
- 系统测试 依据用户需求或者开发合同进行测试,在真实系统工作环境下,验证完整的软件配置项能否和系统正确连接。
测试方式
- 白盒测试
又称结构测试,测试程序的结构和处理算法。
「阶段」 单元测试阶段
「逻辑覆盖」
- 语句覆盖(SC) 每个语句至少执行一遍
- 判定覆盖(DC) 不仅每个语句至少执行一遍,每个判断的每种可能性的结果至少执行一遍
- 条件覆盖(CC) 不仅被测语句至少执行一遍,使判定表达式中的每个条件都取到各种可能的结果
- 判定/提交覆盖(CDC) 每个判断的每种可能性的结果至少执行一遍,使判定表达式中的每个条件都取到各种可能的结果
- 条件组合覆盖(MCC) 使每个判定表达式中条件结果的所有可能组合至少出现一次
- 路径覆盖 使得每条可能执行到的路径都至少经过一遍
- 黑盒测试 又称功能测试,包括等价类划分,边值分析,错误推测和因果关系。 「阶段」 集成测试和确认测试阶段
- α 测试 用户在开发者指导完成的测试。
- β 测试 一个或者多个用户在实际使用中测试。
- 回归测试 软件变更之后,对变更部分正确性和变更需求的符合性,以及软件原有的,其他的部分进行的不损害测试。
极限编程(XP)
- 四大价值观 沟通,简单,反馈,勇气
- 五大原则 快速反馈,简单性假设,逐步修改,提倡更改,优质工作
- 十二大最佳实践 计划游戏,小型发布,隐喻,简单设计,测试先行,重构,集体代码所有制,结对编制,每周工作 40 小时,持续集成,编码标准,现场客户
软件文档
- 开发文档 《功能要求》,《投标方案》,《需求分析》,《技术分析》,《系统分析》,《数据库文档》,《功能函数文档》,《界面文档》,《编译手册》,《QA 手册》,《项目总结》
- 管理文档 《产品简介》,《产品演示》,《疑问解答》,《功能介绍》,《技术白皮书》,《评测报告》
- 用户文档 《安装手册》,《使用手册》,《维护手册》,《用户报告》,《销售培训》
程序错误总数的计算方法
错误总数=错误数/错误率 错误率=共同错误数/错误数
软件维护
- 改正性维护
- 适应性维护
- 完善性维护
- 预防性维护
McCabe 度量法计算程序图的环路复杂性
- 方法一 公式 V(G)=E(边数)-N(结点数)+2
- 方法二 判定结点(有分支的结点)+1
风险管理
属于项目管理的一环。
- 风险识别 建立风险条目检查表,试图系统化地确定对项目计划的威胁。
- 风险预测
又称风险估算,评估风险发生的可能性或者概率,以及如果风险发生了所产生的后果。
以下为 4 个风险预测活动:
- 建立一个尺度,以反映风险发生的可能性
- 描述风险的后果
- 估算风险对项目及产品的影响
- 标注风险预测的整体精确度,以免产生误解
- 风险评估 定义风险参考水平值,预测影响参加水平值的风险组合。
- 风险控制 风险避免,风险监控和风险管理及意外事件计划。
软件危机
- 软件生产本身存在着复杂性
- 软件开发所使用的方法和技术有关
项目活动图
「关键路径」 从起点到终点最长的路径。 「某结点最早和最晚开始时间」 最早时间:顺推,从起点 0 开始,求多条路径,取较大的那个路径。 最晚时间:逆推,从终点开始,求多条路径,取较小的那个路径。 「松弛时间」 活动最晚开始时间减去活动最早开始时间。
面向对象方法
三大特点:封装,继承,多态。
多态
- 通用多态
- 参数多态 同一对象,函数或过程能以一致的形式用于不同的类型。
- 包含多态 例如:子类型化,即一个类型是另一个类型的子类型。
- 特定多态
- 过载多态 通过语法对不同语义的对象使用相同的名。
- 强制多态 通过语义操作把一个变元的类型加以变换,以符合一个函数的要求。
对象和类
对象
「概念」一组属性及这组属性上的专用操作的封装体。
- 三要素
- 对象标识(名称)
- 属性(状态,数据,成员变量)
- 服务(操作,行为,方法)
- 特性
- 可拓展性
- 清晰的边界
- 良好定义的行为
类
「概念」一组具有相同属性和方法的对象抽象。 「注意」抽象类没有实例。
- 分类
- 边界类(接口类) 系统外部环境和内部环境运作之间的交互,它工作在参与者和系统之间。
- 控制类 特定用例的控制行为,与特定的用例实现密切相关。
- 实体类 存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关。
- 关系
- 依赖关系 修改元素 X 的定义可能引起另一个元素 Y 的定义的修改。 「标识方式」带箭头的虚线
- 泛化关系 描述了一般事务与该事务中的特殊种类之间的关系。 继承是泛化的反关系,子类从父类继承,而父类就是子类的泛化。 「标识方式」带空箭头的实线
- 聚合关系 描述整体和部分的关系。 「标识方式」带空心菱形的实线 「生命周期」整体和部分不一致
- 组合关系 描述整体和部分的关系。 「标识方式」带实心菱形的实线 「生命周期」整体和部分一致
- 实现关系 说明和实际联系起来。
UML
通用机制
- 包 组织模型的组块。
- 接口 描述某个类或者构件的一个服务操作集,可以声明对象类所需要的服务。
- 构件 系统中遵从一组接口且提供实现的物理、可替换的部分。
4 种事务
- 结构事务 名词。通常是模型的静态部分,描述概念或物理元素。
- 行为事务 动词。通常是模型的动态部分,描述跨越时间和空间的行为。
- 分组事务 组织。一些由模型分解成的“盒子”。
- 注释事务 解释。注释事务用来描述、说明和标志模型的任何元素。
5 个系统试图
- 逻辑视图 又称设计视图,表示设计模型中在架构方面具有重要意义的部分,即类,包和用例实现的子集。
- 进程视图 可执行线程和进程作为活动类的建模,是逻辑视图的一次执行实例,描述了并发与同步结构。
- 实现视图 对组成基于系统的物理代码的文件和构件进行建模。
- 部署视图 把构件部署到一组物理结点上,表示软件到硬件的映射和分布结构。
- 用例视图 最基本的需求分析模型。
用例之间的 3 个关系
- 包含关系 可以从两个或两个以上的用例中提取公共行为。 「抽象用例」提取出来的公共用例。 「基本用例」又名基础用例,就是原始用例。 「重要特征」抽象用例是基础用例必须的部分。
- 扩展关系 一个用例明显地混合了两种或者两种以上的不同场景,可以将这个用例分成一个基本用例和一个或者多个扩展用例。 「重要特征」抽取的用例相对于基础用例来说不是必须的。
- 泛化关系 多个用例共同拥有一种类是的结构和行为,将共性抽象成为父用例,其他的用例作为泛化关系中的子用例。
14 种图
- 结构性视图
- 类图 描述一组类,接口,协作和它们之间的关系。
- 对象图 描述一组对象及它们之间的关系。
- 包图 描述模型本身分解而成额组织元素,以及它们之间的依赖关系。
- 组合结构图 描述结构化类的内部结构,包括结构化类与系统其余部分的交互点。
- 构件图 描述一个封装类和它的接口、端口以及内嵌的构件与连接件构成的内部结构。
- 部署图 描述对运行时的处理结点及在其中生存的构件的配置。
- 制品图 描述计算机中一个系统的物理结构。
- 行为性视图
- 用例图 描述一组用例、参与者及它们之间的关系。
- 顺序图(时序图,序列图) 一种交互图,由一组对象或者参与者以及它们之间可能发送的消息构成。 「同步消息」 发送者把控制传递给接收者,然后停止活动,等到消息接收者放弃或返回控制。 「异步消息」 发送者通过消息把信号传递给接收者,然后继续自己活动,不等待接收者返回消息或控制。 「返回消息」 从过程调用返回。如果是从过程调用返回,则返回消息是隐含的,可以不画出来。对于非过程调用,如果有返回消息,必须画出来。 「阻止消息」 消息发送者发出消息给接收者,如果接收者无法立即接收这个消息,则发送者放弃这个消息。 「超时消息」 消息发送者发出消息给接收者,并按指定时间等待,如果接收者无法在指定时间内接收这个消息,则发送者放弃这个消息。
消息样式
- 通信图 一种交互图,强调收发消息对象或参与者的结构组织。
- 定时图 一种交互图,强调消息跨越不同对象或者参与者的实际时间。
- 状态图 描述一个状态机,由状态,转移,事件和活动组成。
- 活动图 将精彩或其他计算结构展示为计算内部一步步的控制流和数据流。
- 交互概览图 活动图和顺序图的混合物。
7 大原则
- 单一职责原则(SRP) 一个类应该只有一个职责。
- 开闭原则(OCP) 软件组成实体应该是可扩展的,但是不可修改,实现了面向对象的封装性和可重复性。
- 李氏替换原则(LSP) 子类应当可以替换父类并出现在父类能够出现的任何地方。
- 依赖倒置原则(DIP) 在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖具体类。
- 接口隔离原则(ISP) 采用多个与特定客户类有关的接口比采用一个通用的涵盖过个业务方法的接口要好。
- 组合重用原则 能用到组合实现的地方,尽量用组合来实现,而不要使用继承来扩展功能。
- 迪米特原则 一个对象应该对于其他对象由最少的了解,有效降低类之间的耦合。
继承
继承方式
在 C++中,类的继承方式如下:
- public 基类的公有成员和保护成员作为派生类的成员时,它们保持原来的状态,而基类的私有成员仍然是私有的。派生类的对象可以访问基类中的公有成员,成员函数可以访问基类中的公有成员和保护成员。
- private 基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。
- protected 基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,积累的私有成员仍然是私有的。
分析与设计
分析
基于用例模型,通过对象建模记录确定的对象、对象封装的数据和行为以及对象之间的关系。
「3 个活动」
- 建模系统功能
- 发现并确定业务对象
- 组织对象并确定其关系
设计
基于分析对象模型,设计各个对象,对象之间的关系和通讯方式,主要作用是对 OOA 的结果作进一步的规范化整理。
构造函数和析构函数
构造函数
类的一个成员函数,建立对象时自动调用的函数。
- 特点
- 函数名必须与定义它的类同名
- 没有返回值
- 被声明定义为公有函数
- 在构建对象时由系统自动调用
析构函数
又称拆构函数,在对象消失之前的瞬间自动调用的函数。
- 特点
- 没有任何参数,不能被重载,但可以有虚函数,一个类只有一个析构函数
- 没有返回值
- 函数名与类名相同,但在类名前加上一个逻辑非运算符“~”
- 一般由用户自己定义,在对象消失时由系统自动调用
设计模式
分类
- 创建型
- Factory Method(工厂方法)
- Abstract Factory(抽象工厂)
- Singleton(单例)
- Builder(构建)
- Prototype(原型)
- 结构型
- Adapter(适配器)
- Composite(组合)
- Decorator(装饰器)
- Proxy(代理)
- Flyweight(享元)
- Facade(门面)
- Bridge(桥接)
- 行为型
- Strategy(策略)
- Template Method(模板方法)
- Iterator(迭代器)
- Chain of Respoonsibility(行为型模式有策略)
- Commend(命令)
- Memento(备忘录)
- State(状态)
- Visitor(访问者)
- Observer(观察者)
- Interpreter(解释器)
- Mediator(调停器)
作用
- 重用设计。
- 为设计提供共同的词汇,方便交流。
- 在开发文档中采用模式词汇可以让其他人更容易理解你的想法和做法。
- 应用设计模式可以让重构系统变得容易,可确保开发正确的代码,并降低在设计或实现中出现错误的可能。
- 支持变化,可以为重写其他应用程序提供很好的系统架构。
- 节省时间。
- 适应需要变化。
转载自:https://juejin.cn/post/7145775382107521032