[UML]UML系列——类图class的关联关系(聚合、组合)
关联的概念
关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用。
程序演示:关联关系(code/assocation)
假设:一个公司只有三名员工:一个员工要么没有工作,要么只能在一个公司工作。(代码简化了,主要说明关联关系)
Person类:
class person
{
public string name;
public person(string eName)
{
name = eName;
}
public void startWork()
{
Console.WriteLine("员工{0}开始工作",name);
}
}
Person
Company类:
class company
{
public string name; //公司名称
public person[ ] employee = new person[]; public company(string cName) //构造函数
{
name = cName;
} public void run()
{
Console.WriteLine("公司“{0}”开始运作",name);
employee[].startWork();
employee[].startWork();
employee[].startWork();
} public void stop()
{
Console.WriteLine("公司“{0}”停止运作", name);
}
}
Company
控制台程序:
class Program
{
static void Main(string[] args)
{
company c = new company("北京能力有限公司");
c.employee[] = new person("张三");
c.employee[] = new person("李四");
c.employee[] = new person("王二");
c.run();
c.stop();
Console.Read();
}
}
Program
输出:
对应的类图:

二元关联
概念:两个类之间的关联成为二元关联。
符号:


比如:在一个大公司里,公司总裁只认识那些核心职员,不认识所有的普通职员,而所有的职员都认识总裁。
public class 大公司总裁
{
private 核心职员 A;
} public class 核心职员
{
private 大公司总裁 B;
} public class 普通职员
{
private 大公司总裁 B;
}
对应的类图:
单向关联关系对应的代码:
public class A
{
private B b;
} public class B
{
}
双向关联关系对应的代码:
public class A
{
private B b;
} public class B
{
private A a;
}
关联的名称

关联的名称表达了关联的内容,一般使用动宾结构的短语。(例如上面的类图中:work)
关联命名的原则是该命名是否有助于理解该模型。
关联的角色
关联中的角色是类的对象在关联中所扮演的角色。例如上图中的:employer(雇佣方),employee(员工:受雇佣的人)。关联的角色会转换为代码。
class company
{
public string name; //公司名称
public person[ ] employee = new person[3];
public company(string cName) //构造函数
{
name = cName;
}
……
}
关联的可见性
用可见性修饰角色名称,以说明角色名称可以在哪些范围内可被访问到。

代码:
class company
{
public string name; //公司名称
// "+"
public person[] employee = new person[]; public company(string cName) //构造函数
{
name = cName;
}
……
}
关联的多重性
多重性是指有多少个对象参与了关联。具体的说,是指类A的一个对象对应类B的对象的个数。
举个例子说明吧:

对应代码:
public class 狗
{
private 腿[] X = new 腿[];
} public class 腿
{
……
}
(就是上面的数字描述)
多重性有哪些表示?
- 1: 表示1个
- 0..*: 表示任意多个( ≥0)(*可以换成n)
- *: 表示任意多个( ≥0)
- 1..*: 表示1个或多个(≥1)
- 0..1: 表示0个或1个
- 5..11: 表示5-11个
- 1,3,8: 表示个1或3个或8个
- 0,3..8: 表示0个或3-8个
在Rose中怎么设置?

聚合与组合
聚合(聚集)与组合(合成、组成)是两种特殊的关联。
1、聚合(关联的特例)
聚合的概念:聚合表示类之间的整体与部分的关系。聚合意味着一个类拥有但共享另一个类的对象。
程序演示:聚合(code/associationB)
class cpu
{
public string name; //品牌
public string rate; //主频 public cpu(string cpuName,string cpuRate)
{
name = cpuName;
rate = cpuRate;
}
}
class computer
{
public string buyTime;
public string color;
public cpu mycpu; public computer(string computerBuyTime,string computerColor)
{
buyTime = computerBuyTime;
color = computerColor;
}
public void cpuInfo()
{
Console.WriteLine("该电脑的CPU品牌为:{0}",mycpu.name);
Console.WriteLine("该电脑的CPU主频为:{0}", mycpu.rate);
}
}
class Program
{
static void Main(string[ ] args)
{
cpu cpuA = new cpu("Intel","2.93");
cpu cpuB = new cpu("AMD","2.61"); computer computerC = new computer("2008-9-1","黑色");
Console.WriteLine("购买时间为:{0}", computerC.buyTime);
Console.WriteLine("颜色为:{0}\n", computerC.color); Console.WriteLine("现在安装第一块CPU");
computerC.mycpu = cpuA; //将cpuA装入该电脑中
computerC.cpuInfo(); Console.WriteLine("\n现在安装第二块CPU");
computerC.mycpu = cpuB; //将cpuA装入该电脑中
computerC.cpuInfo();
}
}
聚合的符号
在整体类端加空心菱形。

当整体类不存在时,不分类仍可能存在。部分类销毁时,整体类也将能够存在。
关联关系和聚合关系在语法上是没办法区分的,得从语义上才能更好的区分两者的区别。
2、组成
组成的概念:组成是一种特殊形式的聚合。
与聚合相比,它有两个特点:
- 一个部分类最多只能属于一个整体类
- 当整体类不存在时,部分类将同时被销毁。
最容易理解的一个例子就是窗体和文本框,当窗体不存在时,文本框也将不存在。

组成的符号:
在整体类端加实心菱形。如图:

聚合与组成的区别

关联与聚合(包括组合)的区别
关联关系所涉及的两个类是处于同一个层次上的。比如学生和课程就是一种关联关系,而不是聚合关系,因为学生不是有课程组成的。
聚合关系涉及的两个类处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和显示器、键盘、主板、内存就是聚合关系,因为主板是电脑的组成部分。而键盘等部件不会因为电脑没了,就不存在了。
聚合与组合的区别:
组合:整体类端的重数必须是1,部分类的重数是任意的。
聚合:整体类端的重数可以大于1,部分类的重数是任意的。
关联关系的Rose建模
1、二元关联关系

2、设置关联名和角色名

3、设置多重性

4、设置关联的可见性

5、添加双向关联按钮(工具栏上默认是没有双向关联的按钮的,得自己添加)

6、聚合:(1)添加关联,并设置关联的名称与角色名

(2)双击关联线,弹出右窗, 选中Aggregate

7、组合:(1)添加关联,并设置关联的名称与角色名

(2)双击关联线,弹出右窗,选中Aggregate和By Value

总结
在介绍关联关系中,又介绍了聚合和组合这两种特殊的关联,在使用的时候一定要注意这两者的区别。容易混淆。不能按字面意义来理解......
本来打算把类图的四种关系介绍完的,这才发现,就关联关系也是个长篇大论了,写的多了,你也烦,我也烦,LZ不喜欢看太长的文章,不利于理解。
好了,一起慢慢消化吧.......如果您觉得对您有点帮助,不妨点一下推荐.....
系列文章
[UML]UML系列——用例图中的各种关系(include、extend)
[UML]UML系列——类图class的关联关系(聚合、组合)的更多相关文章
- [UML]UML系列——类图class的依赖关系
相关文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列—— ...
- [UML]UML系列——类图class的泛化关系
系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图C ...
- [UML]UML系列——类图class的实现关系Realization
系列文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) [UML]UML系列——类图Class ...
- UML简单介绍—类图详解
类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...
- 3.UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系
统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...
- UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- 类图class的关联关系(聚合、组合)
类图class的关联关系(聚合.组合) 关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code ...
- [UML]UML系列——类图Class
相关文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) 一.类图的概念及组成 1.类图的概念 类图是描述类.接 ...
随机推荐
- .net core 用grpc实现微服务
GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...
- kali 2.0 U盘安装错误Your installation cd-rom couldn't be mounted
1.kali 2.0前天(2015.08.11)发布了.果断下载下来换掉本机的1.0版本. 2.用U盘安装的过程中,出现cd-rom无法挂载.提示错误Your installation CD-ROM ...
- linux 系统工具集
Htop Htop是一款非常先进的交互式实时Linux进程监测工具.它非常类似Linux top命令,但是有一些丰富的功能特性,比如易于使用的界面,可用于管理进程.快捷键.进程的垂直和水平视图以及其他 ...
- [转]ASP.NET Core 中间件详解及项目实战
本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...
- 【2016-10-31】【坚持学习】【Day16】【MongoDB】【入门 -概念】
MongoDB 概念解析 不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档.集合.数据库,下面我们挨个介绍. 下表将帮助您更容易理解Mongo中的一些概念: SQL术 ...
- 全面剖析 <input> 标签 ------ HTML\HTML5
<input>标签因其形式多样.功能强大,当之无愧成为了WEB前端开发人员最钟爱的元素之一.下面就来对<input>做一个全面的剖析: 标签定义: <input> ...
- 4.bootstrap练习笔记-内容区块
bootstrap练习笔记-内容区块 1.bootstrap中,采用的全部是div布局,把你的内容首先要包含在一个大的DIV区块当中 2.然后再写一个div.container,这个div里面存放真正 ...
- Python-07-面向对象(进阶篇)
1.面向对象高级语法部分 1.1 静态方法 通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里 ...
- django authenticate
程序少不了验证用户与权限分配.通过 Django 自带以及我们一些扩展就能够满足验证与权限的需求. 我在使用 Django 遇到的"login(request, user) 之后,再重定向这 ...
- javaScript中的页面传值
function getURIParam(name) { var search = window.location.search; search = search.substring(1); if ( ...