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

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


比如:在一个大公司里,公司总裁只认识那些核心职员,不认识所有的普通职员,而所有的职员都认识总裁。

1 public class 大公司总裁
2 {
3 private 核心职员 A;
4 }
5
6 public class 核心职员
7 {
8 private 大公司总裁 B;
9 }
10
11 public class 普通职员
12 {
13 private 大公司总裁 B;
14 }

对应的类图:
单向关联关系对应的代码:

1 public class A
2 {
3 private B b;
4 }
5
6 public class B
7 {
8 }

双向关联关系对应的代码:

1 public class A
2 {
3 private B b;
4 }
5
6 public class B
7 {
8 private A a;
9 }

关联的名称

关联的名称表达了关联的内容,一般使用动宾结构的短语。(例如上面的类图中:work)
关联命名的原则是该命名是否有助于理解该模型。
关联的角色
关联中的角色是类的对象在关联中所扮演的角色。例如上图中的:employer(雇佣方),employee(员工:受雇佣的人)。关联的角色会转换为代码。

1 class company
2 {
3 public string name; //公司名称
4 public person[ ] employee = new person[3];
5
6 public company(string cName) //构造函数
7 {
8 name = cName;
9 }
10 ……
11 }

关联的可见性
用可见性修饰角色名称,以说明角色名称可以在哪些范围内可被访问到。

代码:

1 class company
2 {
3 public string name; //公司名称
// "+"
4 public person[] employee = new person[3];
5
6 public company(string cName) //构造函数
7 {
8 name = cName;
9 }
10 ……
11 }

关联的多重性
多重性是指有多少个对象参与了关联。具体的说,是指类A的一个对象对应类B的对象的个数。
举个例子说明吧:

对应代码:

1 public class 狗
2 {
3 private 腿[] X = new 腿[4];
4 }
5
6 public class 腿
7 {
8 ……
9 }

(就是上面的数字描述)
多重性有哪些表示?
- 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)

1 class cpu
2 {
3 public string name; //品牌
4 public string rate; //主频
5
6 public cpu(string cpuName,string cpuRate)
7 {
8 name = cpuName;
9 rate = cpuRate;
10 }
11 }


1 class computer
2 {
3 public string buyTime;
4 public string color;
5 public cpu mycpu;
6
7 public computer(string computerBuyTime,string computerColor)
8 {
9 buyTime = computerBuyTime;
10 color = computerColor;
11 }
12 public void cpuInfo()
13 {
14 Console.WriteLine("该电脑的CPU品牌为:{0}",mycpu.name);
15 Console.WriteLine("该电脑的CPU主频为:{0}", mycpu.rate);
16 }
17 }


1 class Program
2 {
3 static void Main(string[ ] args)
4 {
5 cpu cpuA = new cpu("Intel","2.93");
6 cpu cpuB = new cpu("AMD","2.61");
7
8 computer computerC = new computer("2008-9-1","黑色");
9 Console.WriteLine("购买时间为:{0}", computerC.buyTime);
10 Console.WriteLine("颜色为:{0}\n", computerC.color);
11
12 Console.WriteLine("现在安装第一块CPU");
13 computerC.mycpu = cpuA; //将cpuA装入该电脑中
14 computerC.cpuInfo();
15
16 Console.WriteLine("\n现在安装第二块CPU");
17 computerC.mycpu = cpuB; //将cpuA装入该电脑中
18 computerC.cpuInfo();
19 }
20 }

聚合的符号
在整体类端加空心菱形。

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

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

聚合与组成的区别

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

2、设置关联名和角色名

3、设置多重性

4、设置关联的可见性

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

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

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

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

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

总结
在介绍关联关系中,又介绍了聚合和组合这两种特殊的关联,在使用的时候一定要注意这两者的区别。容易混淆。不能按字面意义来理解......
本来打算把类图的四种关系介绍完的,这才发现,就关联关系也是个长篇大论了,写的多了,你也烦,我也烦,LZ不喜欢看太长的文章,不利于理解。
好了,一起慢慢消化吧.......如果您觉得对您有点帮助,不妨点一下推荐.....
类图class的关联关系(聚合、组合)的更多相关文章
- [UML]UML系列——类图class的关联关系(聚合、组合)
关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code/assocation) 假设:一个公司 ...
- StarUML类图相关——关联、聚合、组合、泛化、依赖、实现
在阅读设计模式相关的书籍,或者其他一些项目.相关博客等等,经常会遇到类图,它对于一个类的信息,如变量.方法及其可见性,类与类(接口)之间的继承关系.依赖关系.聚合关系.组合关系等,都可以比较形象得当地 ...
- UML类图的常见关系1
设计模式之UML类图的常见关系(一) 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggre ...
- [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 ...
- 类图class的依赖关系
类图class的依赖关系 相关文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) ...
- UML类图还不懂?来看看这版乡村爱情类图,一把学会!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.码场心得
- UML类图详解_组合关系
组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...
随机推荐
- ArcGIS JavaScript API本地部署离线开发环境[转]
原文地址:http://www.cnblogs.com/brawei/archive/2012/12/28/2837660.html 1 获取ArcGIS JavaScript API API的下载地 ...
- unix cd使用命令
[语法]: cd [夹] [说明]:此命令用于工作文件以改变当前的文件夹,使用环境变量没有参数$HOME 作为它的参数,$HOME 路径通常在注册时输入. [抽样]: cd 文件夹 c ...
- 带你轻松玩转Git--瞬间创建本地仓库
在上一篇文章中我们对版本控制有了一个比较宏观的了解,同时也能够看到Git 所处在的历史地位.并且对版本控制系统的体系进行了一个宏观的对比,貌似让读者看起来挺复杂的样子. 笔者将会尽可能的简单向大家分享 ...
- MyEclipse2014 设备 checkstyle、PMD、findbugs 最简单的方法 详细说明
最近的实验需要的代码审查和应用程序性能优化.在需求MyEclipse安装某些插件,由于如今的MyEclipse版本号和大多数教程的不一样了,一些安装选项也已经改变,所以安装起来非常费事,通过不断的尝试 ...
- Leetcode:unique_binary_search_trees
一. 称号 给定的数目n.问:有多少种不同BST(二叉搜索树) 比如: 因为N =3,共同拥有5种独特的BST. 1 3 3 2 1 \ ...
- Codeforces Round #248 (Div. 2) (ABCD解决问题的方法)
比赛链接:http://codeforces.com/contest/433 A. Kitahara Haruki's Gift time limit per test:1 second memory ...
- Middleware详解
Middleware详解 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章 ...
- OData.NET已在 GitHub上开源
OData.NET已在 GitHub上开源 微软最近已将OData .NET所有类库的源代码全部发布在GitHub上. 以下与OData相关的项目目前都已迁移到GitHub上: ODataLib Ed ...
- Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size
眼下项目已快截止,编码任务也基本完毕.如今主要是性能測试. 项目是依照"Tair LDB基于Prefixkey的范围查找性能优化项目提议方案"的步骤一步步完毕的,首先先介绍第一个关 ...
- 归并排序 & 快速排序
归并排序 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有 ...