关联的概念

关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用。

程序演示:关联关系(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系列——用例图Use Case

[UML]UML系列——用例图中的各种关系(include、extend)

[UML]UML系列——类图Class

[UML]UML系列——类图class的关联关系(聚合、组合)的更多相关文章

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

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

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

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

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

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

  4. UML简单介绍—类图详解

    类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...

  5. 3.UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  6. GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系

    统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...

  7. UML中的类图及类图之间的关系

    统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...

  8. 类图class的关联关系(聚合、组合)

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

  9. [UML]UML系列——类图Class

    相关文章       [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) 一.类图的概念及组成 1.类图的概念 类图是描述类.接 ...

随机推荐

  1. Postgresql扩展及UUID

    切换数据库 \connect $DBNAME 查看Postgresql的可用扩展 SELECT * FROM pg_available_extensions; 安装所需扩展 CREATE EXTENS ...

  2. [django]windows下用Django,静态文件请求失败,出现UnicodeDecodeError

    问题:windows下用Django,静态文件请求失败,出现UnicodeDecodeError:'utf-8' codec can't decode byte 0xb0 in position 1: ...

  3. 架构实例之Demo_JSP_JavaBean

    架构实例之Demo_JSP_JavaBean 1.开发工具和开发环境      开发工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),mysql5.7.1 ...

  4. 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  5. 电脑缺少**.dll文件

    今天一时手残他么的删了好几个Microsoft Visual C++,导致腾讯的软件都不能用,搞了半天最后在360我的专家里看到相同问题,后来照做,就给下载好啦,哈哈哈哈哈哈哈哈,360大神 

  6. BZOJ1500: [NOI2005]维修数列[splay ***]

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12278  Solved: 3880[Submit][Statu ...

  7. 嵌入式Linux驱动学习之路(十九)触摸屏驱动、tslib测试

    触摸屏使用流程: 1. 按下产生中断. 2.在中断处理程序中启动AD转换XY坐标. 3.AD转换结束并产生AD中断. 4. 在AD的中断处理函数中上报信息,启动定时器. 5. 定时器时间到后进入中断, ...

  8. [No000082]Convert和Parse的区别/Convert.ToInt32()与int.Parse()的区别

    (1)这两个方法的最大不同是它们对null值的处理方法: Convert.ToInt32(null)会返回0而不会产生任何异常,但int.Parse(null)则会产生异常. 没搞清楚Convert. ...

  9. [No00006D]下载离线版的github for windows【以Github for Windows 3.0.110.为例】

    目录 先上地址后讲原理: 原理: 11个目录的文件怎么一口气下载呢? 最后,把下好的文件批量名,同时将GitHub.exe.manifest也放到软件根目录下(与GitHub.exe同级): 今后的猜 ...

  10. PAT 1036. 跟奥巴马一起编程(15)

    美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝"计算机科学教育周"正式启动,奥巴马编写了很简单的计算机代 ...