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

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