UML关联和依赖区别

UML中UML依赖和UML关联关系的异同

1.关联:连接模型元素及链接实例,用一条实线来表示;
2.依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;
3.聚集:表示整体与部分的关系,用一条实线加空心菱形来表示;
4.组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;
(关联,依赖,聚集,组成的异同见后描述)
5.泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示;
6.实现:表示类与接口的关系,用一条虚线加空心箭头来表示;

UML依赖和UML关联的异同:(《Java面向对象编程》一书,作者:孙卫琴来源:www.javathinker.org)
在建立对象模型时,很容易把依赖、关联和聚集关系混淆。当对象A和对象B之间存在依赖、关联或聚集关系时,对象A都有可能调用对象B的方法,这是三种关系之间的相同之处,除此之外,它们有着不同的特征。

1.UML依赖关系的特征

对于两个相对独立的系统,当一个系统负责构造另一个系统的实例,或者依赖另一个系统的服务时,这两个系统之间主要体现为依赖关系,例如生产零件的机器和零件,机器负责构造零件对象。再例如充电电池和充电器,充电电池通过充电器来充电。再例如自行车Bicycle和打气筒Pump,自行车通过打气筒来充气。图1-39为Bicycle类与Pump类的类框图。

图1-39Bicycle类与Pump类的依赖关系

Bicycle类和Pump类之间是依赖关系,在Bicycle类中无需定义Pump类型的变量。Bicycle类的定义如下:
publicclassBicycle{
/**给轮胎充气*/
publicvoidexpand(Pumppump){
pump.blow();
}
}
在现时生活中,通常不会为某一辆自行车配备专门的打气筒,而是在需要充气的时候,从附近某个修车棚里借个打气筒打气。在程序代码中,表现为Bicycle类的expand()方法有个Pump类型的参数。以下程序代码表示某辆自行车先后到两个修车棚里充气:
myBicycle.expand(pumpFromRepairShed1);//到第一个修车棚里充气
myBicycle.expand(pumpFromRepairShed2);//若干天后,到第二个修车棚里充气。下面我们来看一下UML关联关系的特征,和UML依赖做一下对比。

2.UML关联关系的特征

对于两个相对独立的系统,当一个系统的实例与另一个系统的一些特定实例存在固定的对应关系时,这两个系统之间为关联关系。例如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司;再例如自行车和主人,每辆自行车属于特定的主人,每个主人有特定的自行车,图1-40显示了主人和自行车的关联关系。而充电电池和充电器之间就不存在固定的对应关系,同样自行车和打气筒之间也不存在固定的对应关系。

图1-40主人和自行车的关联关系

Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。以下是Person类的定义:
publicclassPerson{
private Bicyclebicycle;//主人的自行车
public BicyclegetBicycle(){
return bicycle;
}
public void setBicycle(Bicyclebicycle){
this.bicycle=bicycle;
}
/**骑自行车去上班*/
public void goToWork(){
 bicycle.run();
}
}
在现时生活中,当你骑自行车去上班时,只要从家里推出自己的自行车就能上路了,不象给自行车打气那样,在需要打气时,还要四处去找修车棚。因此,在Person类的goToWork()方法中,调用自身的bicycle对象的run()方法。假如goToWork()方法采用以下的定义方式:
/**骑自行车去上班*/
publicvoidgoToWork(Bicyclebicycle){
bicycle.run();
}
那就好比去上班前,还要先四处去借一辆自行车,然后才能去上班。

另一篇:

依赖(Dependency)

[依赖]

对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。

[具体表现]

依赖关系表现在局部变量,方法的参数,以及对静态方法的调用

[现实例子]

比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作

[UML表现](图1.2)

图1.2 Person类与Screwdriver类的依赖关系

[代码表现]

  1. public class Person{

  2. /** 拧螺丝 */

  3. public void screw(Screwdriver screwdriver){   表现为方法参数

  4. screwdriver.screw();

  5. }

  6. }

3.关联(Association)

[关联]

对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。

[具体表现]

关联关系是使用实例变量来实现

[现实例子]

比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司

[UML图] (图1.3)

图1.3 公司和员工的关联关系

[代码表现]

  1. public class Company{

  2. private Employee employee;

  3. public Employee getEmployee(){

  4. return employee;

  5. }

  6. public void setEmployee(Employee employee){

  7. this.employee=employee;

  8. }

  9. //公司运作

  10. public void run(){

  11. employee.startWorking();

  12. }

  13. }

(4)聚合(Aggregation)

[聚合]

当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

[具体表现]

与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。

[关联与聚合的区别]

(1)关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。

聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。

(2)对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。

[UML图](图1.4)

图1.3 电脑和组件的聚合关系

[代码表现]

  1. public class Computer{

  2. private CPU cpu;

  3. public CPU getCPU(){

  4. return cpu;

  5. }

  6. public void setCPU(CPU cpu){

  7. this.cpu=cpu;

  8. }

  9. //开启电脑

  10. public void start(){

  11. //cpu运作

  12. cpu.run();

  13. }

参考:

http://developer.51cto.com/art/201006/205597.htm

http://blog.csdn.net/super_ma_1981/article/details/2569723

关联分类:

单向关联

双向关联

自关联;

在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。例如:一个节点类(Node)的成员又是节点Node类型的对象。如链表。

重性关联

多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。多重性关联与聚合还是有点差别的。

依赖表现形式:

依赖关系通常通过三种方式来实现,第一种也是最常用的一种方式是 将一个类的对象作为另一个类中方法的参数,第二种方式是在一个类的方法中将另一个类的对象作为其局部变量,第三种方式是在一个类的方法中调用另一个类的静态方法

聚合(Aggregation)关系表示整体与部分的关系。在聚合关系中,成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。例如:汽车发动机(Engine)是汽车(Car)的组成部分,但是汽车发动机可以独立存在,因此,汽车和发动机是聚合关系。

组合(Composition)关系也表示类之间整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也将不存在,成员对象与整体对象之间具有同生共死的关系。在UML中,组合关系用带实心菱形的直线表示。例如:人的头(Head)与嘴巴(Mouth),嘴巴是头的组成部分之一,而且如果头没了,嘴巴也就没了,因此头和嘴巴是组合关系。

代码实现组合关系时,通常在整体类的构造方法中直接实例化成员类。(这点比较常见)。

(0)

相关推荐