在 UML 中,依赖关系(dependency)和关联关系(association)都是类之间的横向关系,较难区分,所以我在这里做些整理,以便更好的阅读 UML 类图。
依赖关系(dependency)
阐述:
可以简单的理解,就是一个类 A 使用到了另一个类 B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是 B 类的变化会影响到 A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;依赖关系总是单向的。
表现:
表现在代码层面,如类 B 作为参数被类 A 在某个方法中使用。
实现:
依赖关系体现为:局部变量、方法中的参数,还有对静态方法的调用。
关联关系(association)
定义:
该关系体现的是两个类、或者类与接口之间语义级别的一种强依赖关系;这种关系比依赖更强,不存在依赖关系的偶然性,关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,可以是双向的。
表现:
表现在代码层面,比如被关联类 B 以类属性的形式出现在关联类 A 中,也可能是关联类 A 引用了一个类型为被关联类 B 的全局变量;
实现:
关联关系是使用实例变量实现的。
两者之间的联系
很多关系(泛化、继承、关联、聚合,等)都包含依赖关系,当这些关系存在时,不需要再额外建立依赖关系。依赖关系强调一个类需要使用另一个类;关联关强调结构,一个类持有另一个类的实例,当有需要时可以自由地使用。
例子
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(); } } |