软件系统设计2023 期末复习
设计原则
- 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中;或就一个类而言,应该仅有一个引起他变化的原因。是实现高内聚、低耦合的指导方针 。
- 开闭原则:一个软件实体应当对扩展开放,对修改关闭。
- 里氏替换原则:软件中如果能够使用基类对象,那么一定能够使用其子类对象。
- 依赖倒转原则:高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该 依赖于细节,细节应该依赖于抽象;或针对接口或抽象类编程,而不是针对实现或具体类编程。
- 接口隔离原则:客户端不应该依赖那些它不需要的接口。一旦一个接口太大,则需要将它分割成一些更细小的接口, 使用该接口的客户端仅需知道与之相关的方法即可。
- 合成复用原则:要尽量使用组合/聚合关系,少用继承。
- 迪米特法则/最小知识原则:每一个软件单位对其他的单位都只有最少的知识,而 且局限于那些与本单位密切相关的软件单位;一个软件实体应当 尽可能少的与其他实体发生相互作用。
策略模式
工厂方法模式

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体产品对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好地符合了“开闭原则”。
抽象工厂模式
产品等级结构:抽象电视机-具体电视机属于一个产品等级结构;抽象冰箱-具体冰箱属于另一个产品等级结构
产品族:海尔电视机-海尔冰箱-海尔空调属于一个产品族
抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模 式针对的是一个产品等级结构,而抽象工厂模式则需要面对多 个产品等级结构。
开闭原则的倾斜性:增加新的工厂和产品族容易, 增加新的产品等级结构麻烦

状态模式

状态模式对“开闭原则”的支持并不太好,对于可以切换状 态的状态模式,增加新的状态类需要修改那些负责状态转换 的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
命令模式
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。



观察者模式/发布订阅模式/模型视图模式

中介者模式

模板方法模式
适配器模式
适配器模式(Adapter Pattern) :将一个接口转换成 客户希望的另一个接口,适配器模式使接口不兼容的 那些类可以一起工作,其别名为包装器(Wrapper)。 适配器模式既可以作为类结构型模式,也可以作为对 象结构型模式。
组合模式
组合模式(Composite Pattern):组合多个对象形成 树形结构以表示“整体-部分”的结构层次。组合模 式对单个对象(即叶子对象)和组合对象(即容器对 象)的使用具有一致性。 • 组合模式又可以称为“整体-部分”(Part-Whole)模 式,属于对象的结构模式,它将对象组织到树结构中, 可以用来描述整体与部分的关系。

装饰模式

与继承关系相比,关联关系的主要优势在于不会破坏类的封装性, 而且继承是一种耦合度较大的静态关系,无法在程序运行时动态扩 展。在软件开发阶段,关联关系虽然不会比继承关系减少编码量, 但是到了软件维护阶段,由于关联关系使系统具有较好的松耦合性, 因此使得系统更加容易维护。当然,关联关系的缺点是比继承关系 要创建更多的对象。
使用装饰模式来实现扩展比继承更加灵活,它以对客户透明的方式 动态地给一个对象附加更多的责任。装饰模式可以在不需要创造更 多子类的情况下,将对象的功能加以扩展。
外观模式
引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统 之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。

根据“单一职责原则” ,在软件中将一个系统划分为若干个子系统 有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间 的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引 入一个外观对象,它为子系统的访问提供了一个简单而单一的入口。
外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可 以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度。
在不引入抽象外观类的情况下,增加新的子系统可能需 要修改外观类或客户端的源代码,违背了“开闭原则”。
代理模式
通过引入一个新的对象(如小图片和远程代理对 象)来实现对真实对象的操作或者将新的对象作 为真实对象的一个替身,这种实现机制即为代理 模式,通过引入代理对象来间接访问一个对象, 这就是代理模式的模式动机

随便默默
软件架构文档包
Beyond
a. 文档路线图:包含了范围、总结和简明摘要
b. 视图的文档组织方式:描述了文档内的视图是如何组织的
c. 系统概要:从整体上描述当前架构的简要介绍、业务驱动因素等
d. 不同视图的映射关系
e. 系统原理:从整体上描述当前架构的设计原理
f. 目录-索引、词汇表、首字母缩略表
View
a. 体系结构风格和视图
b. 结构视图,包含模块视图、组件和连接器视图、部署视图
c. 质量视图
在每个View内包含
a. 主视图:显示视图的元素和关系,以及图例
b. 元素列表:详细介绍a中的每个元素、元素属性、关系属性、元素接口以及行为
c. 上下文图:描述了系统如何与环境相关
d. 可变性指引:描述视图中可能变化的地方
e. 基本原理:描述设计是如何映射到视图中的,以及其合理性
ATAM中每个阶段的输出:
step-0 准备和建立团队
a. 评估计划
step-1 评估1
a. 架构的简明介绍
b. 业务目标(驱动因素)的阐释
c. 作为场景的特定质量属性所要求的优先级列表
d. 效用树
e. 风险点和无风险点
f. 敏感点和均衡点
step-2 评估-2
a. 涉众们的场景优先级列表
b. 风险主题和业务驱动因素各种受到的威胁
step-3 后续
a. 最终的评估报告
ATAM中每个阶段参与的stakeholders与其职责
step-0 准备和建立团队
参与者:评估团队领导、关键项目决策者
职责:根据体系架构文档生成评估计划
step-1 评估1
参与者:评估团队、项目决策者
职责:
a. 评估负责人介绍ATAM方法
b. 项目经理或客户从业务角度介绍业务驱动因素
c. 首席架构师介绍体系结构
d. 评估团队确定架构方法
e. 评估团队和项目决策者生成质量属性效用树
f. 评估团队分析架构方法
step-2 评估2
参与者:评估团队、项目决策者 、项目涉众
职责:
a. 评估负责人再次介绍ATAM方法,并展示之前取得成果
b. 涉众头脑风暴确定场景优先级
c. 评估团队分析架构方法
e. 评估团队展示架构方法,并提交给涉众
step-3 后续
参与者:评估团队、主要涉众
职责:评估团队制作最终评估报告,并交给主要涉众审核后,递交给委托评估的人
软件架构过程中的一般活动,以及每个活动的输入、输出
识别ASRS:
输入:涉众
输出:优先的质量属性场景
架构设计:
输入:优先的质量属性场景、需求和约束、策略和模式
输出:一组由模式决定的选场景的草图
架构文档化:
输入:一组由模式决定的选场景的草图、涉众
输出:view & beyond
架构评估:
输入:view & beyond、涉众、优先的质量属性场景
输出:view & beyond
软件架构的来源
- 非功能需求 NFRs
- 架构攸关需求 ASRs
- 质量属性
- 涉众和组织
- 技术环境
- 业务目标
- 商业与技术决策组合
有哪些通用设计策略(generic design strategies),给每个策略提供一个简明工作示例
- 抽象:使用抽象让设计师关注本身结构而不关注实现,例如将系统抽象为组件-连接器
- 分解:针对某一系统关注点分解后处理,例如将整个系统或某个模块分解
- 分而治之:将每个模块分别处理
- 生成与测试:将一个特定的设计看作是一个假设;根据测试路径生成测试
- 迭代与细化:使用迭代的方法,例如ADD方法多次迭代直至满足所有ASR
- 复用元素:重用在设计过程中出现了可以复用的元素,例如重用现有架构
什么是ASR,列举提取和识别ASR的四种来源和方法
ASRs 架构攸关需求是对体系结构产生了深远影响的需求
四种来源和方法:
- 从需求文档获取ASRs:MoScoW方法,用户故事
- 从采访涉众获取ASRs:软件质量工作坊
- 从业务目标获取ASRs:
- 用质量属性效用树管理ASRs:
ADD过程
- 确定由足够的需求信息
- 选择要分解的系统要素
- 确定选择的要素的ASR
- 选择符合ASR的设计
- 找出设计问题
- 列出子关注点替代模式/决策
- 从清单中选择模式/决策
- 确定模式/决策与ASR之间的关系
- 记录初步的架构视图
- 评估并解决不一致问题
- 实例化架构元素并分配职责
- 实例化元素定义接口
- 验证和完善需求
- 重复2-7步直到满足所有的ASR
风险点、权衡点、敏感点
- 识别风险:发现对所需的质量属性有负面影响的架构决策,例如使用分层模式会导致性能损耗
- 发现权衡:发现对多个质量属性有影响的架构决策,例如使用分层模式会损耗性能,但也会解耦增加系统的可修改性
- 发现敏感:发现特定质量属性对其敏感的架构决策, 例如对性能敏感的系统,使用缓存中间件
设计、体系结构(架构)、结构的关系
设计包含架构,架构包含结构
结构是静态的、逻辑的,是关于系统如何组成的
架构除了包含结构,还包含了组件之间的相关的关系结构,并定义一些动态的行为
架构是关于软件设计的,所有架构都是软件设计,但不是所有的设计都是架构,架构是软件设计的一部分
为什么使用不同视图,给出4种视图
原因:
- 不同视图支持不同的目标和用户,突出不同的系统元素和关系
- 不同视图将不同的系统元素暴露出不同的程度
视图:
- 模块视图:提供一组连贯职责的实现单元
- 组件连接器视图:显示具有某些运行时存在的元素
- 部署视图:反映了软件单元到软件开发或运行环境元素的映射
- 质量视图:安全视图、性能视图、可靠性视图、沟通视图、异常视图
- 组合视图
描述4+1视图
- 逻辑视图:描述架构中的重要元素和关系
- 过程视图:描述元素的并发和交互
- 物理视图:描述主要过程和组件如何映射到硬件上
- 发展视图:描述软件组件的内部组织联系
- 用例场景:捕获架构需求,与一个或多个视图有关
SOA:
核心:
- 服务契约
- 服务封装
- 服务重用
- 服务组合
- 服务自治
- 服务无状态
对互操作性:支持服务自动识别、注册、调用
对可伸缩性:服务高内聚,松耦合,易于可伸缩
对安全性:中间件可能被攻击;多服务导致追踪溯源困难
微服务
在SOA基础上
- 取消ESB,改用轻量级通信协议
- 部署和管理结合devops实现自动化
- 增加API网关
- 增加熔断器