)二元关联 元关联存在一对一、一对多、多对多三种形式,其关联的设计方法也有差异。 1)一对一的二元关联 ①单向导航:要实现一对一关联的单向导航,只在导航源的类中增加另一个类的主键 属性。例如:图9.5(a)描述“系”和“系主任”两个类是一对一的关联关系,单向从“系” 导航到“系主任”类。在“系”中增加“主任编号”属性就实现了两个类之间的单向导航 一般建模工具会自动对单向关联关系的源类一方,建立相关联的另外一个类的关健属性作 为自己的一个附加属性。图9.5(b)是 Rational rose建立模型时,在单向导航的一对一的 元关联,在“系”类中附加的属性。 图95一对一关联单向导航的实现 ②双向导航:一对一关联的双向导航需要关联的两个类中分别增加对方的关键属性。 例如,图9.6(b)是对(a)中双向导航的实现。 图96一对一关联双向导航的实现 6
2)一对多的二元关联 两个存在一对多关联关系的类,其导航方向肯定是由多重性为多的类导航到多重性为 的类,而不会相反。在多重性为多的一方类中增加另一个类的关键属性就实现了关联的 导航关系。例如,图9.7(b)是对(a)中一对多单向导航的实现 图97一对多关联单向导航的实现 图98多对多关联的实现
3)多对多的二元关联 多对多二元关联的实现需要在两个类之间增加一个新类,用另外两个类中的关键属性 作为这个类的属性。例如,图9.8(a)“课程”和“教师”两个类之间存在多对多的关联关 系。为了实现这两个类之间的双向关联,需要在它们之间增加一个“授课”类,并把“课 程”和“教师”两个类的关键属性“课程编号”和“教师编号”,作为“授课”类的属性, 这样把两个多对多的二元关联就转化成为三个类中两两之间的一对多的关联,其导航关系 分别是从“授课”类到另外两个类。见图9.8(b)和图9.8(c) 2)三元关联的设计 假定讨论的三元关联中存在关联类,介绍维持法的设计方法。 维持三元关联关系不变,三个存在关联关系的类保持不变,给关联类中增加其它三个 类的关键属性。例如,图9.9(a)中,“教师”、“班级”、“课程”存在“授课”的三元关联 (b)是对(a)中这种关系的设计,(c)是几个类的属性 教师 生日期 狂级编 果程编号 级名 程名 授 课形式 教学效果 (a) 图99维持法实现三元关联 2.组成关系设计 般面向对象程序设计语言都直接提供对组成关系的支持。在定义整体类时,把其部 分对象作为整体类的成员,这样就构成和整体与部分的组成关系。所以组成关系的设计十
分简单 3.泛化关系设计 所有面向对象程序设计语言都提供继承支持,因此泛化关系本身就被面向对象程序设 计语言支持。但有些语言仅支持单继承,不支持多继承,因此,对设计模型中的多继承要 进行必要处理。一种方法是把多继承转化成为单继承,第二种方法是用接口来实现多继承 下面我们介绍用接口实现多继承的方法。 图910是一个多继承的例子。“汽车”继承了“陆上交通工具”和“水上交通工具” 两个类。为了让“汽车”能够具有“陆上交通工具”和“水上交通工具”的特性,首先定 义“陆上交通工具”和“水上交通工具”的接口,然后在“汽车”类中实现这两个接口, 这样就让“汽车”类拥有了“陆上交通工具”和“水上交通工具”的操作。 陆上交通工具机动交通工具 陆上父通工具机动交通工具 《 Interface》 《 interface》 陆上交通工具机动交通工具 汽车 图910接口实现多继承 汽车 91.5类的优化 对从业务领域中提取有些复杂的类需要进一步优化。对类进行优化的原则是使类能够 明确的表示事物实体,并具有相对独立性、一致性和适中的规模。类优化方法很多,在此 我们引用数据库设计中的规范化理论来对类进行优化。在数据库设计中,一般根据规范原 则检査关系的优劣,如果一个关系符合范式规约,可以说该关系是规范的。否则就需要对 该关系进行优化处理,通过对关系的分解使其满足范式要求。实体类具有属性,关系也具 有属性,因此,我们可以通过引用规范化方法,来对实体类进行优化。规范化理论和方法 读者可以参考有关数据库书籍,在此,我们将以“图书订单”类的规范过程为例,讨论对 实体类的优化过程。规范的类将满足三级规范要求。一级规范要求在类中所有属性是不可 再分的基本属性项,二级规范是在满足一级规范的基础上,类中不存在对主键属性部分依 赖的属性。三级规范则要求在满足二级规范的基础上,在类中不存在传递依赖关系。下面 我们分四步对由图911“图书订单”所产生的“图书订单”类(图9.12)进行优化 首先,不加分析地建立一个图912的“图书订单”类,这个类完全是根据订单中包含 的项目提取出该类的属性
图911书务系统的图书订单 图913一级规范后的“图书订单”类 图912初步的“图书订单”类 10