[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.类图的概念 类图是描述类.接 ...
随机推荐
- WPF 自定义Expander
自定义Exander,收缩侧边栏 样式如下 <Grid> <Grid.Resources> <ControlTemplate x:Key="ExpanderCo ...
- [WPF系列]-Prism+EF
源码:Prism5_Tutorial 参考文档 Data Validation in WPF √ WPF 4.5 – ASYNCHRONOUS VALIDATION Reusable asyn ...
- springmvc 上传下载
springmvc文件上传下载在网上搜索的代码 参考整理了一份需要使用的jar.commons-fileupload.jar与commons-io-1.4.jar 二个文件 1.表单属性为: enct ...
- ACM练手
#include<iostream> #include<string.h> using namespace std; #define N 100 class stack { c ...
- 第21章 java线程(1)-线程初步
java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题
庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...
- 微信小程序购物商城系统开发系列-工具篇
微信小程序开放公测以来,一夜之间在各种技术社区中就火起来啦.对于它 估计大家都不陌生了,对于它未来的价值就不再赘述,简单一句话:可以把小程序简单理解为一个新的操作系统.新的生态,未来大部分应用场景都将 ...
- python脚步管理工具supervisor=3.3.0的安装、使用。基于linux系统。
一.安装相关包 sudo apt-get install python-pip #python的安装包的工具 sudo apt-get install python-dev # ...
- 微信内嵌html5页面清楚缓存
给每个js添加一个版本号,每次修改js后改变一下版本号,浏览器即可自动刷新不用手动清理缓存 <script src="<%=path%>/js/boss/kpi/redli ...
- JS组件系列——基于Bootstrap Ace模板的菜单和Tab页效果分享(你值得拥有)
前言:最近园子里多了许多谈语言.谈环境.谈逼格(格局)的文章,看看笑笑过后,殊不知其实都是然并卵.提升自己的技术才是王道.之前博主分享过多篇bootstrap组件的文章,引起了很多园友的关注和支持,看 ...