类图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类图详解_组合关系
组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...
随机推荐
- 大数据系列修炼-Scala课程07
由于昨天下班后有点困,就没有来及写博客,今天会把它补上!把这个习惯坚持下去! 关于Scala高阶函数详解 1.Scala高阶函数代码实现:高阶函数就是在我们函数中套用函数 2.高阶函数代码详解:高阶函 ...
- javascript实现数据结构:广义表
原文:javascript实现数据结构:广义表 广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...
- BIZTALK项目中WEB引用WEBSERVICES服务时候报错
近期工作中须要完毕通过BIZTALK完毕调用WEBLOGIC公布的WebServices服务,环境搭建好后,打开VS开发工具新建一个BIZTALK项目,加入WEB引用将对方公布的地址拷贝上去,能够正常 ...
- 【百度地图API】如何判断点击的是地图还是覆盖物?
原文:[百度地图API]如何判断点击的是地图还是覆盖物? 摘要:很多API爱好者问我,为什么我点击的是marker,而map也会响应该事件呢?怎样才能判断,我点击的是标注,还是地图呢?下面一起来看看. ...
- MySQL编程(0) - Mysql中文乱码问题解决方案
MySQL 5.6 for Windows 解压缩版配置安装: http://jingyan.baidu.com/article/f3ad7d0ffc061a09c3345bf0.html MySQL ...
- POJ3342——Party at Hali-Bula
Party at Hali-Bula Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5418 Accepted: 192 ...
- Linux经常使用命令(一) - ls
ls命令是linux下最经常使用的命令.ls命令就是list的缩写, 缺省下ls用来打印出当前文件夹的清单, 假设ls指定其它文件夹, 那么就会显示指定文件夹里的文件及文件夹清单. 通过ls 命令不仅 ...
- Object-C面向对象之实现类
Object-C面向对象之实现类 一般涉及到面向对象都会C#,Java都不可避免的涉及到类,C#中类的后缀名是.cs,Java中是.java,Object-C中一般用两个文件描述一个类,后缀名为.h为 ...
- Visual Studio 2015环境
Visual Studio 2015环境搭建 2014年11月13日,微软发布了Visual Studio 2015 Preview,跟随者Visual Studio 2015 而来的是,.net 开 ...
- VMware Workstation 无法与 Windows XP \ Windows 7 \ Windows 8 进行共享文件夹。
1.这是一个小Bug,做法很简单. ----①.如果安装了VMware Tools,先卸载VMware Tools,重启虚拟机,再安装VMware Tools,重启虚拟机,就行了. ----②.如果没 ...