19.5 基于角色的设计——使用角色组装协作
19.5.1 相关理论
协作被定义为“多个对象为了完成某种目标而进行的交互”。而角色是“特定协作中的对象的抽象”,它“仅定义了对象特征的一个对某协作有意义的子集”。协作和角色的概念和现实世界很接近,图19-7的例子展示了角色在协作中的作用。由例子可以看出,基于角色的设计的意义在于:我们很容易通过已有角色的组合来构造新的协作,以完成新的功能。

图19-7 角色与协作
接口隔离原则(Interface Separation Principle)信奉“多个专用接口优于一个单一的通用接口”的思想,因为“任何接口都应当具有高内聚性”,以便“保证实现该接口的类的实例对象可以只呈现为单一的角色”。
19.5.2 基于角色的设计举例
比如,待开发的一个软件系统,其后台数据源可能是关系数据库、一般的文件,还可能是另一个私有数据库。既然接口可以隔离变化,我们可以定义一个单一的接口,为所有的数据客户类提供服务。如图19-8所示。

图19-8 “宽”接口设计
但是,上面的设计违背了基于角色的设计思想,根本不能保证“实现该接口的类的实例对象可以只呈现为单一的角色”,这会带来一些问题。比如,有一个数据客户类,不需要插入、更新等功能,而仅仅需要对数据进行读操作,这时显然一个提供“读”服务的“角色”是最合理的设计,但CRowSetManager却是如此之“宽”的一个接口。最终,我们可以这样来改进设计,如图19-9所示。

图19-9 运用基于角色的设计进行接口隔离






