提示:文章详细的讲解了类图的四种关系,以及每种关系如何转化为对应的代码。
UML-类图和类图转化为代码
- 一、类于类之间的关系
- 1.依赖关系
- 2.关联关系
- (1) 单向关联
- (2) 双向关联
- (3) 自关联
- (4) 聚合关联(has-a)
- (5) 组合关联(contains-a)
- 3.泛化关系(is-a)
- 4.实现关系
- 二、UML类图转化为代码
- 1.依赖关系(Dependency)
- 2.泛化关系(Generalization)
- 3.关联关系(Association)
- (1)单向关联
- (2)双向关联
- (3)自关联
- 4.聚合关系(Aggregation)
- 5.组合关系(Composition)
- 6.实现关系(Implementation)
- 三、类图转化为代码例题联系
- 四、总结
一、类于类之间的关系
1.依赖关系
- 依赖关系 是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。
- 依赖关系使用一个带箭头的虚线表示,箭头指向被依赖的对象(或被使用的对象)。
2.关联关系
- 关联关系是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一类对象与另一类对象之间有联系。
- 关联的多重性:
- 关联的多重性是指有多少对象可以参与关联,它可以用来表达一个取值范围、特定值、无限定的范围或者一组离散值。
- UML 中关联的多重性用数字标识的范围来表示,其格式为 “minimum…maximum” ,其中 minimum 和 maximum 都表示 int 类型。
- 多重性也可以使用符号 “*” 来表示一个没有上限或者说上限为无穷大的范围。
- 赋给一个端点的多重性表示该端点可以有多个对象与另一个端点的一个对象关联。
(1) 单向关联
- 单向关联使用一个带箭头的实线来表示,箭头指向关联的一方。
(2) 双向关联
- 双向关联使用实线表示,将两个类连接起来。
(3) 自关联
- 一个类可以与自己关联,这是可以将其称为自关联或者自身关联。
(4) 聚合关联(has-a)
- 简单理解:部分类可以脱离整体而存在。
- 部分类的生命周期独立于整体类的生命周期,即部分类能够脱离整体而单独存在,称为聚合关系。
- 聚合关系使用一个带空心菱形的实线来表示,空心菱形指向整体。
(5) 组合关联(contains-a)
- 简单理解:部分类不能够独立存在。
- 部分类的生命周期不独立于整体类的生命周期,即部分类不能够脱离整体而单独存在,称为组合关系。
- 组合关系使用一个带实心菱形的实线来表示,实心菱形指向整体。
3.泛化关系(is-a)
- 简单理解:继承关系
- 泛化关系使用一个带三角箭头的实线来表示,箭头指向父类,即被继承的元素。
4.实现关系
- 简单理解:实现接口
- 实现关系使用一个带三角箭头的虚线来表示,箭头指向接口,即被实现元素。
二、UML类图转化为代码
1.依赖关系(Dependency)
- 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
public class TV{
private int color;
public void change(Channel c){}
public void turn_on(){}
public void turn_off(){}
}
public class Channel{}
2.泛化关系(Generalization)
- 通过 extends 关键字实现继承结构。
public Tank{
public void ram(){}
public void radion(){}
}
public Special extends tank{}
3.关联关系(Association)
- 关联关系表示为某个类以成员变量的形式包含其他类的对象。
(1)单向关联
public class ClassA{
private ClassB classB;
}
public class ClassB{}
(2)双向关联
public class Company{
private Person[] persons;
}
public class Person{
private Company company;
}
(3)自关联
public class WorkerPerson{
private WorkerPerson workerPerson;
}
4.聚合关系(Aggregation)
- 作为成员变量利用构造方法赋值。
public class Car{
private Engien engien;
private Wheel wheel;
public Car(Engien engien, Wheel wheel){
this.engien = engien;
this.wheel = wheel;
}
}
5.组合关系(Composition)
- 作为成员变量在构造函数中实例化另一个对象。
public OnePerson{
private Head head;
public OnePerson(){
head = new Head();
}
}
public class Head{}
...
6.实现关系(Implementation)
通过 implements 关键字实现。
public interface IMyInterface{
public String g;
public int i;
public int charge();
}
public class MyClass implements IMyInterface{}
三、类图转化为代码例题联系
- 在购物车例子中,Product 类表示一个商品,包含3个属性:id、名称和价格。Cart 类表示一个购物车,包含2个属性:产品列表,同时具有添加商品和计算商品总价的方法。User类表示一个客户,包含两个属性:姓名、邮件、密码和购物车列表。请根据描述画出类图、并用简单的代码实现用户添加商品计算价格功能
public class User{
private String name;
private String email;
private String password;
private List<Cart> carts;
public User(List<Cart> carts){
this.carts = carts;
}
}
public class Product{
private int id;
public String name;
public Float price;
}
public class Cart{
public List<Product> products;
public int add_product(int product){}
public Float get_total_price(){}
}
四、总结
- 这些关系之间的强弱程度不同,从强到弱的结果是:
- 泛化关系=实现关系>组合关系(组合关联)>聚合关系(聚合关联)>关联关系(普通关联)>依赖关系
- 代码转换小妙招:
- 依赖关系和关联关系箭头指向的类都是“被动”的,写在另外一个类当中。
- 泛化关系和实现关系三角箭头指向的都是父类或者接口。
- 关于多重性记忆的小妙招:
- 赋给一个端点的多重性表示该端点可以有多个对象与另一个端点的一个对象关联。