天天看点

GRASP 9种模式整理

对《UML和模式应用》一书中的GRASP模式进行整理,便于查阅、温习

GRASP:General Responsibility Assignment Software Pattern,职责驱动对象的设计

9种模式

  1. 创建者
  2. 信息专家
  3. 低耦合
  4. 控制器
  5. 高内聚
  6. 多态
  7. 间接性
  8. 纯虚构
  9. 防止变异

原则

谁拥有、知晓信息,谁负责

问题:给对象分配职责的基本原则是什么

方案:把职责分配给信息专家,它具有实现这个职责所必需的信息

问题:负责创建某类的新实例的职责

方案:B创建A,当:

- B包含A;
     - B记录A;
     - B直接使用A;
     - B具有A的初始化数据;
     - B是对象A的创建者。           

问题:怎样降低依赖性,减少变化带来的影响,提高重用性

方案:利用这一原则来评估方案

耦合:是对某元素和其他元素之间的链接、感知和依赖程度的度量

问题:在UI层之上首先接收和协调系统操作的第一个对象是什么?

方案:控制器职责分配给以下之一:

- 代表整个“系统”、“根对象”、运行软件的设备或主要子系统,这些是“外观控制器”的所有变体
     - 代表用例场景
     - 对于同一用例场景的所有系统事件使用相同的控制器。
               

## 高内聚

问题:怎样保持对象是有重点、可理解的、可管理的,并且能够保持低耦合

方案:利用高内聚评估候选方案

问题:如何处理基于类型的选择?如何创建可插拔的软件构件

方案:当相关选择或行为随类型(类)不同时,使用多态操作为变化的行为类型分配职责。

推论:不要测试对象的类型,也不要使用条件逻辑来执行基于类型的不同选择。

问题:当你并不想违背高内聚和低耦合或其他目标,但是基于专家模式所提供的方案又不合适时,哪些对象应该承担这一职责?

方案:凭空虚构一个不代表问题领域概念的类,来承担这一职责。如数据库存储类

问题:为了避免两个或多个事物之间的直接耦合,应该如何分配职责?如何使对象解耦,一直吃低耦合并提高复用性的潜力?

方案:将职责分配给中介对象,使其作为其他构件或服务之间的媒介,以避免它们之间的直接耦合。中介实现了其他构件之间的间接性。

问题:如何设计对象、子系统和系统,使其内部的变化或不稳定性不会对其他元素产生不良影响

方案:识别预计变化或不稳定支出,分配职责用以在这些变化之外创建稳定接口。