类与类之间的关系
描述关系的UML图综述
依赖:虚线。一个类是另一个类的成员函数的参数或者返回值。
关联:实线(箭头)。一个类是另一个类的成员变量。
2.0一般关联
2.1聚合:(菱形+实线),整体和部分的关系,汽车和发动机,汽车可以选择各型号的发动机。
2.2组合:(实心形+实线),生命体中整体和部分的关系,人和五脏六腑,紧密度更高!实现:虚线+空心箭头。(纯虚函数和抽象类)的派生类实现的
泛化:实线(三角形)。继承关系。子类继承父类
泛化
表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。一般化的关系是从子类指向父类的。
class Animal{}
class Tiger extends Animal{}
public class Test
{
public void test()
{
Animal a=new Tiger();
}
}
依赖
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。
具体表现
依赖关系表现在局部变量,方法的参数,以及对静态方法的调用
现实例子
比如说你要去拧螺丝,你是不是要借助(也就是依赖)螺丝刀(Screwdriver)来帮助你完成拧螺丝(screw)的工作
public class Person{
/** 拧螺丝 */
public void screw(Screwdriver screwdriver){
screwdriver.screw();
}
void drive(Car &mycar){
}
}
关联
对于两个相对独立的对象,当一个对象的实例与另一个对象的一些特定实例存在固定的对应关系时,这两个对象之间为关联关系。
具体表现
关联关系是使用实例变量来实现
现实例子
比如客户和订单,每个订单对应特定的客户,每个客户对应一些特定的订单;再例如公司和员工,每个公司对应一些特定的员工,每个员工对应一特定的公司
public class Company{
private Employee employee;
public Employee getEmployee(){
return employee;
}
public void setEmployee(Employee employee){
this.employee=employee;
}
//公司运作
public void run(){
employee.startWorking();
}
}
关联和依赖的区分
Person
{
Public:
void dowork1(Car *car) //借别人的车去上班 可以借用A、B的车,依赖于别人
{
Car. Run();
}
Void dowork2()
{
m_car.run() //开自己的车上班
}
Private:
Car m_car;
}
Person 和m_car 是关联关系
Person 和 car是依赖关系 void dowork1(Car *car)
聚合
当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚集关系。聚合是关联关系的一种
,是较强的关联关系,强调的是整体与部分之间的关系。
具体表现
与关联关系一样,聚合关系也是通过实例变量来实现这样关系的。关联关系和聚合关系来语法上是没办法区分的,从语义上才能更好的区分两者的区别。
关联与聚合的区别
关联关系所涉及的两个对象是处在同一个层次上的。比如人和自行车就是一种关联关系,而不是聚合关系,因为人不是由自行车组成的。
聚合关系涉及的两个对象处于不平等的层次上,一个代表整体,一个代表部分。比如电脑和它的显示器、键盘、主板以及内存就是聚集关系,因为主板是电脑的组成部分。对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。比如张三的电脑被偷了,那么电脑的所有组件也不存在了,除非张三事先把一些电脑的组件(比如硬盘和内存)拆了下来。
public class Computer{
private CPU cpu;
public CPU getCPU(){
return cpu;
}
public void setCPU(CPU cpu){
this.cpu=cpu;
}
//开启电脑
public void start(){
//cpu运作
cpu.run();
}
}
组合
代表整体的对象负责代表部分对象的生命周期。公司不存在,部门也没有意义了。
再例如:人和五脏六腑、四肢的关系。组合关系。在语义上,组合的整体和部分之间的关系比聚合的更紧密!
实现
实现关系用来表示类与接口之间的实现关系。也表示(纯虚函数)抽象类和具体类之间的关系。