原文地址:http://blog.sina.com.cn/s/blog_5bf130b10100e0s8.html
UML构建元素之关系浅谈
刚接触UML的人可能会有这样的错误认识,“UML就是图形”,其实不然。到底UML包括那些内容,我会在其他豆腐里进行阐述,还是要啰嗦一下子地。。。从上边那张图上也可以看到,UML除了图形,还有建模的元素和关系。这种对象与对象的关系在整个建模体系中还是非常重要的,现在,唐僧开始念经:
从关系的紧密程度上我们由疏至密的顺序依次为:依赖->关联->实现->泛化
一、依赖
一种使用关系,A概念的使用在某些情况下会用到B概念,此时称A依赖于B
程序体现:B作为A的某些方法的参数类型,或返回值类型
public class A {
public void opB(B b){
//B作为参数
}
public B opA(){
//B作为返回值类型
return null;
}
}
UML图形表示:单线箭头的虚线
二、关联关系
拥有关系,方便于传递消息,也可以尽量避免使用继承。B作为A的一部分,属于A,此时称A关联了B。
程序体现:B作为A的数据成员
public class A {
private B boy;
public void opA(){
String s = boy.toString();
}
}
public class B {
public String toString(){
return "boy";
}
}
UML图形表示:单箭头实线
箭头指向的为被关联一方
如果从导向性来看,现在是A知道B,而B并不知道A,所以为单向关联。就像恋爱中的单相思,喜欢他,不敢告诉他,这层关系只有相思之人才懂喽。如果有一天girl终于鼓起勇气向boy表白了,双方并且牵手了,那么这个时候就是双向关联了,即girl知道自己的BF是boy,而boy也知道自己的GF是girl。
程序体现:双方互为数据成员
public class A {
private B boy;
public void opA(){
String s = boy.toString();
}
}
public class B {
private A girl;
public String toString(){
return "boy";
}
}
UML图形表示:无箭头实线
现在再研究一下多重性,如果这个girl有多个男朋友呢?刚才的关系,只是一对一的。这下子变成了一个A对应了多个B,即一对多关系。为了能区分维护和管理好多个男朋友,girl是不是就应该建立一个男朋友档案呢?回答是肯定的,所以我们需要用一个集合来管理所有的boy。这种关系称之为聚合。
程序体现:A类型中存在B的集合
public class A {
private ArrayList<B> boys;
public void opA(){
//TBD
}
}
public class B {
private A girl;
public String toString(){
return "boy";
}
}
请注意,这里是双向的关联呦。
UML图形表示:空心菱形箭头,菱形所在方为单一方
这种关系有一个特点就是A和B的生命周期是不同的,即如果A的实例不存在了,那么所有被A关联的B的实例依然是可以独立存在的。想想看,就算有一天girl与世长辞了,boy们还是会活下去的吧?天涯何处无芳草不是?
但如果存在A实例消亡,而B实例也随之消亡的情况,我们就需要用到另外一种关系了---组合!
思考,你和你的胳膊是不是这种组合关系?当然不是啦!独臂神尼不也活得好好地不是?那和跳动的心脏呢?呵呵,这就叫组合了,人没了,心脏肯定不能再称之为“跳动的心脏”了。我说的是一般情况。提问!“人没了,钱还在;人还在,钱没了”什么关系呢?有想法的欢迎给我留言讨论。
程序体现:A类型中存在B的集合
public class School {
private ArrayList<Department> departments;
}
public class Department {
}
UML图形表示:实心菱形箭头,菱形所在方为单一方
关系解释:学校是由许多院系组成的,如果学校不存在了,院系也将消亡。
三、实现关系
类型的具体表现,由接口和实现类构成。B类型的实现过程中符合A接口要求的所有规范,那么称B实现了A接口。如果不清楚接口的定义,敬请等待我的其它豆腐产品。is a 的关系。实现了接口的类is a 接口类型。
例如:飞行器的接口将定义所有具备飞行能力事物的共同行为,而如果一个超人的类型实现了飞行器定义的所有行为,我们就可以称超人就是一个飞行器。当然,只要实现了接口定义行为的类型都可以,宇宙飞船,风筝,苍蝇,只要你能想到的,并且遵守飞行器接口约定的一切类型。
程序体现:类实现接口
public interface Flyer {
public void takeOff();
public void fly();
public void landing();
}
public class Superman implements Flyer {
public void fly() {
// TODO Auto-generated method stub
}
public void landing() {
// TODO Auto-generated method stub
}
public void takeOff() {
// TODO Auto-generated method stub
}
}
UML图形表现:三角箭头加虚线,箭头指向接口类型
四、泛化关系
也称之为继承关系,由父类和子类构成。子类就是一种类型的父类。父类为更抽象的概念。
好比苹果和水果的关系,水果是更为抽象的概念。我们可以说苹果就是水果,或者苹果是水果的一种。
程序体现:
public class Fruit {
}
public class Apple extends Fruit {
}
UML图形表示:三角箭头加实线,箭头指向父类型
总结: