关联用来表示两个或多个类的对象之间的结构关系,它在代码中表现为一个类以属性的形式包含对另外一个类的一个或多个对象的应用。html
假设:一个公司只有三名员工:一个员工要么没有工做,要么只能在一个公司工做。(代码简化了,主要说明关联关系)ide
Person类:函数
1 class person 2 { 3 public string name; 4 public person(string eName) 5 { 6 name = eName; 7 } 8 public void startWork() 9 { 10 Console.WriteLine("员工{0}开始工做",name); 11 } 12 }
Company类:工具
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 public void run() 12 { 13 Console.WriteLine("公司“{0}”开始运做",name); 14 employee[0].startWork(); 15 employee[1].startWork(); 16 employee[2].startWork(); 17 } 18 19 public void stop() 20 { 21 Console.WriteLine("公司“{0}”中止运做", name); 22 } 23 }
控制台程序:post
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 company c = new company("北京能力有限公司"); 6 c.employee[0] = new person("张三"); 7 c.employee[1] = new person("李四"); 8 c.employee[2] = new person("王二"); 9 c.run(); 10 c.stop(); 11 Console.Read(); 12 } 13 }
输出:url
对应的类图:spa
概念:两个类之间的关联成为二元关联。3d
符号:code
好比:在一个大公司里,公司总裁只认识那些核心职员,不认识全部的普通职员,而全部的职员都认识总裁。htm
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 }
(就是上面的数字描述)
多重性有哪些表示?
在Rose中怎么设置?
聚合(汇集)与组合(合成、组成)是两种特殊的关联。
一、聚合(关联的特例)
聚合的概念:聚合表示类之间的总体与部分的关系。聚合意味着一个类拥有但共享另外一个类的对象。
程序演示:聚合(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 }
聚合的符号
在总体类端加空心菱形。
当总体类不存在时,不分类仍可能存在。部分类销毁时,总体类也将可以存在。
关联关系和聚合关系在语法上是没办法区分的,得从语义上才能更好的区分二者的区别。
二、组成
组成的概念:组成是一种特殊形式的聚合。
与聚合相比,它有两个特色:
最容易理解的一个例子就是窗体和文本框,当窗体不存在时,文本框也将不存在。
组成的符号:
在总体类端加实心菱形。如图:
关联关系所涉及的两个类是处于同一个层次上的。好比学生和课程就是一种关联关系,而不是聚合关系,由于学生不是有课程组成的。
聚合关系涉及的两个类处于不平等的层次上,一个表明总体,一个表明部分。好比电脑和显示器、键盘、主板、内存就是聚合关系,由于主板是电脑的组成部分。而键盘等部件不会由于电脑没了,就不存在了。
聚合与组合的区别:
组合:总体类端的重数必须是1,部分类的重数是任意的。
聚合:总体类端的重数能够大于1,部分类的重数是任意的。
一、二元关联关系
二、设置关联名和角色名
三、设置多重性
四、设置关联的可见性
五、添加双向关联按钮(工具栏上默认是没有双向关联的按钮的,得本身添加)
六、聚合:(1)添加关联,并设置关联的名称与角色名
(2)双击关联线,弹出右窗, 选中Aggregate
七、组合:(1)添加关联,并设置关联的名称与角色名
(2)双击关联线,弹出右窗,选中Aggregate和By Value
在介绍关联关系中,又介绍了聚合和组合这两种特殊的关联,在使用的时候必定要注意这二者的区别。容易混淆。不能按字面意义来理解......
原本打算把类图的四种关系介绍完的,这才发现,就关联关系也是个长篇大论了,写的多了,你也烦,我也烦,LZ不喜欢看太长的文章,不利于理解。
好了,一块儿慢慢消化吧.......若是您以为对您有点帮助,不妨点一下推荐.....
系列文章