类图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的关联关系(聚合、组合)的更多相关文章

  1. [UML]UML系列——类图class的关联关系(聚合、组合)

    关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code/assocation) 假设:一个公司 ...

  2. StarUML类图相关——关联、聚合、组合、泛化、依赖、实现

    在阅读设计模式相关的书籍,或者其他一些项目.相关博客等等,经常会遇到类图,它对于一个类的信息,如变量.方法及其可见性,类与类(接口)之间的继承关系.依赖关系.聚合关系.组合关系等,都可以比较形象得当地 ...

  3. UML类图的常见关系1

    设计模式之UML类图的常见关系(一)   本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggre ...

  4. [UML]UML系列——类图class的依赖关系

    相关文章          [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       [UML]UML系列—— ...

  5. [UML]UML系列——类图class的泛化关系

    系列文章       [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       [UML]UML系列——类图C ...

  6. [UML]UML系列——类图class的实现关系Realization

    系列文章 [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       [UML]UML系列——类图Class   ...

  7. 类图class的依赖关系

    类图class的依赖关系 相关文章          [UML]UML系列——用例图Use Case       [UML]UML系列——用例图中的各种关系(include.extend)       ...

  8. UML类图还不懂?来看看这版乡村爱情类图,一把学会!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.码场心得

  9. UML类图详解_组合关系

    组合关系和聚合关系有一个最大的不同,组合关系中的整体直接掌握部件的生灭,聚合关系中的整体并不具有生灭部件的权力.一旦组合中的整体不存在时,其组合部件也不能单独存在,必须同时消灭.另外,外界也不能直接与 ...

随机推荐

  1. 绑定枚举到dropdownlist

    pageTools.BindEnumToDropdownList(typeof(enumDealerArea), ddlBmwArea, new ListItem("--请选择--" ...

  2. 处理器(CPU)调度问题

     因为处理器是最重要的计算机资源,提高利用率并提高系统性能的处理器(吞吐量.响应时间).于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之中的一个. 一.处理机调度的层次 1. ...

  3. 代码走查工具StyleCop建议采用的规则总结

    代码走查工具StyleCop建议采用的规则总结 续接上篇:代码走查工具篇SytleCop的规则总结与翻译,本篇主要是以我个人的观点总结的一份建议使用的Rule点. 建议使用的Rule点 1.公共的接口 ...

  4. 使用ArcGIS API for Silverlight 进行复合多条件空间查询

    原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进 ...

  5. Swift中文教程(四)--函数与闭包

    原文:Swift中文教程(四)--函数与闭包 Function 函数 Swift使用func关键字来声明变量,函数通过函数名加小括号内的参数列表来调用.使用->来区分参数名和返回值的类型: fu ...

  6. hdu 3874

    求一个序列中全部数字的和,当中数值同样的仅仅能计算一次. 先储存全部的请求,然后依照它们的右边界排序,在查询的同一时候更新区间.这里事实上有一点点DP的味道,在它进行某个查询之前,保证全部的反复数字( ...

  7. 点击鼠标获取元素ID

    原文:点击鼠标获取元素ID public partial class Form1 : Form { public Form1() { InitializeComponent(); } private ...

  8. 下载的youtube视频

    youtube 视频下载方法[详解]   1.打开网址: http://kej.tw/flvretriever/. 2.输入要下载的youtube视频的网址. 3.点击右侧RETRIEVE NOW ! ...

  9. 【软测试】(两)计算机组成原理-cpu

    cpu,中文名称中央处理单元,central processing unit.系统的核心,用于数据的处理,算术以及逻辑运算和控制程序的运行. 组成 运算器 从字面上就能够理解到.运算器主要用来对于逻辑 ...

  10. 阅读安卓在线(Android)系统源代码

    http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 版权声明:本文博客原创 ...