对《UML和模式应用》一书中的GRASP模式进行整理,便于查阅、温习
GRASP:General Responsibility Assignment Software Pattern,职责驱动对象的设计
9种模式
- 创建者
- 信息专家
- 低耦合
- 控制器
- 高内聚
- 多态
- 间接性
- 纯虚构
- 防止变异
原则
谁拥有、知晓信息,谁负责
问题:给对象分配职责的基本原则是什么
方案:把职责分配给信息专家,它具有实现这个职责所必需的信息
问题:负责创建某类的新实例的职责
方案:B创建A,当:
- B包含A;
- B记录A;
- B直接使用A;
- B具有A的初始化数据;
- B是对象A的创建者。
问题:怎样降低依赖性,减少变化带来的影响,提高重用性
方案:利用这一原则来评估方案
耦合:是对某元素和其他元素之间的链接、感知和依赖程度的度量
问题:在UI层之上首先接收和协调系统操作的第一个对象是什么?
方案:控制器职责分配给以下之一:
- 代表整个“系统”、“根对象”、运行软件的设备或主要子系统,这些是“外观控制器”的所有变体
- 代表用例场景
- 对于同一用例场景的所有系统事件使用相同的控制器。
## 高内聚
问题:怎样保持对象是有重点、可理解的、可管理的,并且能够保持低耦合
方案:利用高内聚评估候选方案
问题:如何处理基于类型的选择?如何创建可插拔的软件构件
方案:当相关选择或行为随类型(类)不同时,使用多态操作为变化的行为类型分配职责。
推论:不要测试对象的类型,也不要使用条件逻辑来执行基于类型的不同选择。
问题:当你并不想违背高内聚和低耦合或其他目标,但是基于专家模式所提供的方案又不合适时,哪些对象应该承担这一职责?
方案:凭空虚构一个不代表问题领域概念的类,来承担这一职责。如数据库存储类
问题:为了避免两个或多个事物之间的直接耦合,应该如何分配职责?如何使对象解耦,一直吃低耦合并提高复用性的潜力?
方案:将职责分配给中介对象,使其作为其他构件或服务之间的媒介,以避免它们之间的直接耦合。中介实现了其他构件之间的间接性。
问题:如何设计对象、子系统和系统,使其内部的变化或不稳定性不会对其他元素产生不良影响
方案:识别预计变化或不稳定支出,分配职责用以在这些变化之外创建稳定接口。