just do it

关于UML中的依赖与关联关系

在 UML 中,依赖关系(dependency)和关联关系(association)都是类之间的横向关系,较难区分,所以我在这里做些整理,以便更好的阅读 UML 类图。

依赖关系(dependency)

阐述:
可以简单的理解,就是一个类 A 使用到了另一个类 B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是 B 类的变化会影响到 A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;依赖关系总是单向的。

表现:
表现在代码层面,如类 B 作为参数被类 A 在某个方法中使用。

实现:
依赖关系体现为:局部变量、方法中的参数,还有对静态方法的调用。

关联关系(association)

定义:
该关系体现的是两个类、或者类与接口之间语义级别的一种强依赖关系;这种关系比依赖更强,不存在依赖关系的偶然性,关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,可以是双向的。

表现:
表现在代码层面,比如被关联类 B 以类属性的形式出现在关联类 A 中,也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量;

实现:
关联关系是使用实例变量实现的。

两者之间的联系

很多关系(泛化、继承、关联、聚合,等)都包含依赖关系,当这些关系存在时,不需要再额外建立依赖关系。依赖关系强调一个类需要使用另一个类;关联关强调结构,一个类持有另一个类的实例,当有需要时可以自由地使用。

例子

《关于UML中的依赖与关联关系》

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Program
{
    class Phone
    {
        public void SendMessage(string name,string message)
        {
            Console.WriteLine("Hi,{0}\n{1}",name,message);
        }
    }
    class Employee
    {
        public void SayHello2Customer()
        {
            Phone phone = new Phone();       //依赖关系, Employee 要使用 Phone
            phone.SendMessage("Someone", "Hello");
        }
    }
    class Manager
    {
        Employee staff = new Employee();    //关联关系, 结构上表示了 Manager 雇佣了 Employee
        public void SayHello2Customer()
        {
            staff.SayHello2Customer();      //Manager 可以让 Employee 做些事情
        }
    }
    static void Main(string[] args)
    {
        Manager manager = new Manager();
        manager.SayHello2Customer();
 
        Console.ReadKey();
    }
}
点赞