类与类之间的关系(1)

在软件系统中,类并不是孤立存在的,类与类之间存在各种关系,对于不同类型的关系,UML提供了不同的表示方式。

1. 关联关系

关联(Association)关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系,如汽车和轮胎、师傅和徒弟、班级和学生等等。在UML类图中,用实线连接有关联关系的对象所对应的类,在使用Java、C#和C++等编程语言实现关联关系时,通常将一个类的对象作为另一个类的成员变量。在使用类图表示关联关系时可以在关联线上标注角色名,一般使用一个表示两者之间关系的动词或者名词表示角色名(有时该名词为实例对象名),关系的两端代表两种不同的角色,因此在一个关联关系中可以包含两个角色名,角色名不是必须的,可以根据需要增加,其目的是使类之间的关系更加明确。

如在一个登录界面类LoginForm中包含一个JButton类型的注册按钮loginButton,它们之间可以表示为关联关系,代码实现时可以在LoginForm中定义一个名为loginButton的属性对象,其类型为JButton。如图1所示:

图1 关联关系实例

图1对应的Java代码片段如下:

public class LoginForm {
private JButton loginButton; //定义为成员变量
……
}public class JButton {……
}

在UML中,关联关系通常又包含如下几种形式:

(1) 双向关联

默认情况下,关联是双向的。例如:顾客(Customer)购买商品(Product)并拥有商品,反之,卖出的商品总有某个顾客与之相关联。因此,Customer类和Product类之间具有双向关联关系,如图2所示:

图2 双向关联实例

图2对应的Java代码片段如下:

public class Customer {
private Product[] products;
……
}public class Product {
private Customer customer;
……
}

(2) 单向关联

类的关联关系也可以是单向的,单向关联用带箭头的实线表示。例如:顾客(Customer)拥有地址(Address),则Customer类与Address类具有单向关联关系,如图3所示:

图3 单向关联实例

图3对应的Java代码片段如下:

public class Customer {
private Address address;
……
}public class Address {
……
}

(3) 自关联

在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如:一个节点类(Node)的成员又是节点Node类型的对象,如图4所示:

图4 自关联实例

图4对应的Java代码片段如下:

public class Node {
private Node subNode;
……
}

(4) 多重性关联

多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。

对象之间可以存在多种多重性关联关系,常见的多重性表示方式如表1所示:

表1 多重性表示方式列表

表示方式

多重性说明

1..1

表示另一个类的一个对象只与该类的一个对象有关系

0..*

表示另一个类的一个对象与该类的零个或多个对象有关系

1..*

表示另一个类的一个对象与该类的一个或多个对象有关系

0..1

表示另一个类的一个对象没有或只与该类的一个对象有关系

m..n

表示另一个类的一个对象与该类最少m,最多n个对象有关系 (m≤n)

例如:一个界面(Form)可以拥有零个或多个按钮(Button),但是一个按钮只能属于一个界面,因此,一个Form类的对象可以与零个或多个Button类的对象相关联,但一个Button类的对象只能与一个Form类的对象关联,如图5所示:

图5 多重性关联实例

图5对应的Java代码片段如下:

public class Form {
private Button[] buttons; //定义一个集合对象
……
}public class Button {
……
}

(5) 聚合关系

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。例如:汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此,汽车和发动机是聚合关系,如图6所示:

图6 聚合关系实例

在代码实现聚合关系时,成员对象通常作为构造方法、Setter方法或业务方法的参数注入到整体对象中,图6对应的Java代码片段如下:

public class Car {private Engine engine;//构造注入public Car(Engine engine) {this.engine = engine;}//设值注入
public void setEngine(Engine engine) {this.engine = engine;
}
……
}public class Engine {……
}

(6) 组合关系

组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。在UML中,组合关系用带实心菱形的直线表示。例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系,如图7所示:

图7 组合关系实例

在代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类,图7对应的Java代码片段如下:

public class Head {private Mouth mouth;public Head() {mouth = new Mouth(); //实例化成员类}
……
}public class Mouth {……
}

【作者:刘伟 http://blog.csdn.net/lovelion】

转载于:https://www.cnblogs.com/jinxiang1224/p/8468229.html

深入浅出UML类图(二)相关推荐

  1. 深入浅出UML类图(一)

    在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML Distilled: A Brief Guide to the Standard O ...

  2. 深入浅出UML类图(四)

    实例分析1--登录模块 某基于C/S的即时聊天系统登录模块功能描述如下: 用户通过登录界面(LoginForm)输入账号和密码,系统将输入的账号和密码与存储在数据库(User)表中的用户信息进行比较, ...

  3. 23种设计模式 UML 类图及对应示例代码 (二)

    23种设计模式 UML 类图及对应示例代码 (二) 11.DoFactory.GangOfFour.Flyweight.Structural Flyweight:运用共享技术有效的支持大量细粒度的对象 ...

  4. 设计模式(二)——UML类图怎么画

    UML类图怎么画 一.注释(comment) 注释就是对类图的补充说明,可以附加在任何元素上,用右上角有折角的矩形来表示,其内放置说明文字,通过虚线连接被注释的元素. 二.类(Class) 在面向对象 ...

  5. Java设计模式(二):UML 类图和概述

    目录 一·UML类图 1.1 UML 基本介绍 1.2 UML 图 1.3 UML 类图 1.4 类图-依赖关系 ( Dependence) 1.5 类图-泛化关系(generalization) 1 ...

  6. 设计模式(二)--UML类图和设计模式概述

    一.UML类图 1.UML 基本介绍 UML--Unified modeling language UML (统一建模语言),是一种用于软件系统分析和设计的语言工具,它用 于帮助软件开发人员进行思考和 ...

  7. UML类图操作(二)

    在上一篇中讲了类图的操作以及介绍,当然类不是单独存在的,类与类之间存在着关系,UML提供了类之间的关系的表达方式. UML类图操作(一) 下面简单介绍设置操作,双击关系线,然后找到Detail 1.关 ...

  8. idea添加database插件_IDEA高级玩法:集成JIRA、UML类图插件、SSH、FTP、Database管理......

    优质文章,第一时间送达 上一篇: 下一篇:(已修复) 作者: 菩提树下的杨过 出处: http://yjmyzz.cnblogs.com dea还有很多高大上的功能,易用性几乎能与vs.net媲美,反 ...

  9. UML类图关系大全 and 报表的基本用法

    UML类图关系大全 1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在 GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描 ...

最新文章

  1. python 使用 redis expire属性设置访问时间间隔
  2. 《Python Cookbook 3rd》笔记(1.16):过滤序列元素
  3. [bzoj2127]happiness
  4. LeetCode每日一题——无重复字符的最长子串
  5. Process Kill Technology Process Protection Against In Linux
  6. android--------自定义控件 之 组合控件篇
  7. DTCC技术大会来了
  8. 基于改进注意力机制的U-Net模型实现及应用(keras框架实现)
  9. 推荐一款适合苹果电脑小白使用的BT下载器
  10. 【PHP】面试经历总结之——新浪微博
  11. POJ 1392 Ouroboros Snake (欧拉回路)
  12. 计算机组老师颁奖词,优秀教研团队颁奖词
  13. 访客统计php代码转换图片,PHP实现简单网站访客统计的方法实例
  14. [a, b]均匀分布方差
  15. vue 播放rtmp 直播拉流视频
  16. 求问R语言 分层抽样 合并两个数据框为什么出现了空集
  17. 在 Adob​​e MAX 深入研究 UI/UX 设计
  18. excel-counta
  19. mysql 备份数据库结账_简单的结账功能(可用于各种结账)
  20. myeclipse下载git插件

热门文章

  1. JDK11+Maven开发JavaFx启动问题:java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper
  2. AD域控exchange邮箱(三)——exchange2010卸载报错的解决方法全纪录
  3. 集团公司(嵌入ETL工具)财务报表系统解决方案
  4. mysql 行转列_详解MySQL行列转换4个实现方案及反向行转列实验测试
  5. 域名备案以及再次白嫖阿里云
  6. 计算机算法设计与分析 工作安排问题
  7. 各种图片格式的生成工具(HTML、URL、BBCode、Markdown、Link)
  8. 矩阵快速幂(附模板)
  9. 实验8 群体类、流类库与输入/输出(4学时)
  10. ~~通过预处理逆元的方式求组合数