关联的概念

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

程序演示:关联关系(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. [很郁闷]python2.7连接mysql5.5配置

    前言:今天在公司电脑上python版本跟自己家里电脑上的一样,不一样的是mysql公司版本5.6,结果花了两天的时间都没配置好python和mysql 简单说就是python连接mysql一直报200 ...

  2. 树莓派搭建ActiveMQ

    树莓派上安装ActiveMQ和在其它Linux发行版基本相同,只是在开防火墙端口时有区别.   硬件信息: 树莓派3B型,Raspbian系统   安装 //下载ActiveMQ安装包 http:// ...

  3. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 嵌入式Linux驱动学习之路(十六)输入子系统

    以前写的一些输入设备的驱动都是采用字符设备处理的.问题由此而来,Linux开源社区的大神们看到了这大量输入设备如此分散不堪,有木有可以实现一种机制,可以对分散的.不同类别的输入设备进行统一的驱动,所以 ...

  5. BZOJ1856[SCOI2010]字符串

    Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgw ...

  6. iPhone添加邮箱

    阿里云邮箱设置 手机自带的电子邮件客户端该如何添加阿里云邮账号呢?这里以iPhone4s和安卓系统为例,分别进行添加阿里云邮箱帐号的添加.   官网是这么介绍的:   一.如下以iPhone4s为例, ...

  7. Android的setVisibility(View.GONE)无效的问题及原因分析(转)

    出现这种情况很可能是因为设置了animation,并且调用了setFillAfter(true),这就会导致setVisibility无效,只需要调用一下clearAnimation()方法或者去掉s ...

  8. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  9. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  10. JDBC连接各种数据库的地址名称

    oracle    driverClass:oracle.jdbc.driver.OracleDriver    url:jdbc:oracle:thin:@127.0.0.1:1521:dbname ...