[UML]UML系列——类图class的关联关系(聚合、组合)
关联的概念
关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用。
程序演示:关联关系(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系列——用例图中的各种关系(include、extend)
[UML]UML系列——类图class的关联关系(聚合、组合)的更多相关文章
- [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 ...
- UML简单介绍—类图详解
类图详解 阅读本文前请先阅读:UML简单介绍—类图这么看就懂了 1.泛化关系 一个动物类: /** * 动物类 */ public class Animal { public String name; ...
- 3.UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- GOF 的23种JAVA常用设计模式总结 02 UML中的类图与类图之间的关系
统一建模语言UML 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际 ...
- UML中的类图及类图之间的关系
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- 类图class的关联关系(聚合、组合)
类图class的关联关系(聚合.组合) 关联的概念 关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另一个类的一个或多个对象的应用. 程序演示:关联关系(code ...
- [UML]UML系列——类图Class
相关文章 [UML]UML系列——用例图Use Case [UML]UML系列——用例图中的各种关系(include.extend) 一.类图的概念及组成 1.类图的概念 类图是描述类.接 ...
随机推荐
- 【java开发】数组基本学习
一维数组 定义:具有相同数据类型的一组数据. 声明:int []a=new int[3]; 释义:该数组的数据类型为int型,该数组长度为3,有3个元素 可采用如下方式为元素赋值:a[0]=1; ...
- Oozie coordinator 作业自定义的配置的一些方法
Oozie的coordinator有啥用? The Oozie Coordinator system allows the user to define and execute recurrent a ...
- cin
cin 是预定义的标准输入流对象,cin 用来接收字符串时,遇“空格”.“TAP”.“回车”时都会结束.
- 微软准备开源PowerShell
微软有计划在近期内开源PowerShell 近日微软再次在向开源投出橄榄枝, PowerShell是面向Windows和Windows Server的自动化平台和脚本语言,帮助用户简化系统的管理.在纳 ...
- 修改eclipse的自动完成功能
修改eclipse的自动完成功能 周银辉 用eclipse时还是比较习惯Visual Studio那样的敲一个字母就弹出自动完成框,而不是总要等到敲.号,其实可以设置的: 在preferences ...
- IE10开始支持CSS3 Transitions, Transforms 和 Animations
这是一个好消息,微软公开说明IE10预览版已经支持CSS3属性 Transitions, Transforms 和 Animations,你可以直接写transitions,而不是加个恶心的前缀-ms ...
- Linux下安装VMware Tools 的方法
1.按下 CTRL + ALT 组合键,进入主操作系统,点击VMware虚拟机菜单下的安装虚拟机工具子菜单. 菜单:VM->Install VMware tools....(虚拟机->安 ...
- Java 8新特性终极指南
目录结构 介绍 Java语言的新特性 2.1 Lambdas表达式与Functional接口 2.2 接口的默认与静态方法 2.3 方法引用 2.4 重复注解 2.5 更好的类型推测机制 2.6 扩展 ...
- Elasticssearch学习教程
http://www.cnblogs.com/eggTwo/p/4425269.html
- 【工具使用】sublime text3
import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310 ...