您的位置:首页 > 其它

UML 类图关系详解(学习笔记)

2016-08-17 19:44 465 查看
类的六种关系(按关系由弱到强排列):

依赖关系(Dependency)<关联关系(Association)<聚合关系(Aggregation)<组合关系(Composition)<泛化关系(Generalization)==实现关系(realization)

1,<依赖关系(Dependency)>



依赖关系可解析为A类使用了B类,此处则以Person使用Computer为例子

那么依赖的四种形式为:

(1)参数传递

public class Person
{
//以参数形式/返回值依赖起来
public Computer Programing(Computer toy)
{
return null;
}
}


(2)作为类中的局部对象

public class Person
{
//在函数中以局部变量的形式出现
public void Person()
{
Toy tToy = new Toy();
}
}


(3)调用Computer静态方法

public  class Computer
{
static public void Open(){}
}
public class Person
{
public void Programing()
{
//调用类静态方法
Computer.Open();
}
}


(4)单例类调用

public class Computer
{
//单例类伪代码
static public Instance(){}
public void Open(){}
}
public class Person
{
public void Programing()
{
//使用单例类调用类函数
Computer.Instance().Open();
}
}


2,<关联关系(Association)>



表明一种拥有的关系, 它使一个类知道另一个类的属性和方法,如上图,Teacher和Student是多对多关系,表示一个学生有多个老师,一个老师有多个学生;而Sutdent和Subject是单向关系,即一个学生能同时学习多个科目,但是科目却不记录学生数。代码如下

public class Subject()
{
public Subject(){}
}
public class Teacher()
{
private List<Student> ClassMembers;
public Teacher(){}
public AddStudent(Student s)
{
ClassMembers.Add(s);
}
}
public class Student()
{
private List<Subject> Subjects;
private List<Teacher> SchoolTeachers;
public Student(){}
public AddTeacher(Teacher t)
{
SchoolTeachers.Add(t);
}
public AddSubject(Subject s)
{
Subjects.Add(s);
}
}


依赖与关联的区别:

从类的属性是否增加来看:

*依赖一般不增加类的属性,依赖只在类中局部使用依赖对象的方法。

*关联通常会增加类的属性,属性是一种更为紧密的耦合。

从生存周期来看:

*依赖一般只在类调用方法时产生,随方法调用结束时销毁。

*关联则在类实例化时产生,类销毁时关系结束,生命周期长。

3,<聚合关系(Aggregation)>



如上图所示,PersonGroup(人群)由Person(人)组成,具体来说就是

是整体与部分的关系, 且部分可以离开整体单独存在。

public class Person()
{
public Person(){}
}
public class PersonGroup
{
private List<person> PersonSet;
public PersonGroup(Person p)
{
PersonSet.Add(p);
}
}


聚合关系与关联关系的区别:

聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。

4,<组合关系(Composition)>



组合即如上图所示,翅膀和爪子都是鸟的组成部分,不能分割,而类的表现形式为,用户只知道Bird的存在,不能知道Wind和Paw不能离开Bird存在。代码如下:

public class Bird()
{
private Wind[] wind;
private Paw[]  paw;
public Bird()
{
wind = new Wind[2];
paw  = new Paw[2];
}
}


聚合和组合的区别:

从构造函数来说

*聚合类的构造函数中包含另一个类的实例作为参数,因为该类构造使用外部类,所以Person能作为单独类被使用。

*组合类的构造函数包含另一个类的实例化,因此Wind,Paw与Bird紧密耦合在一起,随Bird的销毁,Wind和Paw也将要被销毁。

从封装性来说

*在聚合关系中,用户可以同时了解PersonGroup类和Person类,因为他们是独立的。

*在组合关系中,用户只认识鸟类,根本不知道翅膀类和爪类的存在,因为翅膀类被严密地封装在鸟类中。

5,<泛化关系(Generalization)>



范化是一种继承关系,通常在基类中包含了虚方法的实现,派生类继承后可以直接使用或者重写(override)方法。代码如下

public class Shape
{
public virtual void Draw(){}
}
public class Circle:Shape
{
public override void Draw(){}
}


6,<实现关系(realization)>



这是一种类与接口的关系, 表示类是接口所有特征和行为的实现,接口中的方法并没有实现,需要用户在派生类中实现,接口在C#中可以用于模拟C++中的多重继承。

public interface IGetName
{
string GetName();
}
public Person:IGetName
{
public string GetName()
{
return "NoBody";
}
}


主要参考:

浅谈UML中类之间的五种关系及其在代码中的表现形式

http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html

UML
9a48
类图几种关系的总结

http://blog.csdn.net/dragonpeng2008/article/details/6836448

UML关系(泛化,实现,依赖,关联(聚合,组合))

http://justsee.iteye.com/blog/808799

作图工具:

StarUML2.7

声明:

该文仅作学习与记录之用,欢迎技术纠错和讨论;

非技术性言论皆为一家之谈,如有不同意见请坚持己见;

如有雷同可能为学习汝之所得,请各位巨人的肩膀还请继续空出位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: