UML核心逻辑视图-类图成分及关系的具体说明
类图技术是面向对象方法的核心技术,应用非常广泛,是进一步学习设计模式的基础!
其中,类、对象,以及它们之间的关系是最基本的建模元素
文章目录
成分介绍
类
类是对一组具有相同属性、操作、关系和语义的对象的描述。
在UML中,类用矩形来表示,并且该矩形被划分为3个部分:名称部分(Name)、属性部分(Attribute)和操作部分(Operation,也可以称为方法)
抽象类
在类的模型上,类名和操作使用斜体,表示抽象类。
涉及的操作是抽象的操作
接口
接口是描叙类的部分行为的一组操作,它也是一个类提供给另一个类的一组操作
接口包含操作但不包含属性
并且它没有对外界可见的关联
继承
继承指的是一个类(子类)继承另外的一个类 (父类)的同一功能,并增加它自己的功能的能力。
从子类(要继承行为的类)拉出一条闭合的、单键头(或三角形)的实线指向超类
泛化 – Generalization
相对继承而言,父类对继承了之的子类为泛化关系
实现
由实现了某个接口的类指向接口,该关系成为实现
表示上,只需要把继承的指向改变,并换成虚线表示即可
依赖,关联,聚合,组合
依据联系的紧密程度,由弱到强,依次为 依赖 < 关联 < 聚合 < 组合
依赖-dependency
如果一个类,偶尔用到某个类,例如,客户吃饭偶尔用到叉子(偶尔吃西餐的时候),那么客户类和叉子类之间就是依赖关系
依赖是类的五种关系中耦合最小的一种关系
在代码形式上,其表现为
public class Client{
public void eat(){
Fork fork = new Fork();
...
}
}
Fork(叉子)类作为该方法的变量来使用
请注意Fork类的生命期,它是当Client类的eat()方法被调用的时候,才被实例化。
持有Fork类的是Client类的一个方法而不是Client类,这点是最重要的
注意:
只有Client类知道Fork类的存在,而Fork类不知道Client的存在
Fork类被Client类的一个方法持有。生命期随着方法的执行结束而结束
关联-association
关联是实线加箭头表示。表示类之间的耦合度比依赖要更强
关联分单向关联和双向关联
在一个单向关联中,两个类是相关的,但是只有一个类知道这种联系的存在
在一个双向关联中,两个类互相知道对方
例如,客户需要与商家进行沟通,此时客户与商家就是关联关系,进而言之,如果商家也要跟客户沟通,这就构成了双向关联
注意:
关联关系中,关联类的属性持有被关联的类,也即被关联类作为关联类的类属性存在
单向关联下,只有关联类知道被关联类的存在;而在双向关联中,两类互知
此关系的生命周期,在类实例化时产生,类销毁时消失
聚合-aggregation
该关系是关联关系的再细分,耦合度比关联更强些
聚合通常是整体与部分之间的关系
例如 公司和员工。此时的整体和部分,都可以独立存在
图例中,使用空心菱形+实线+箭头的方式表示
代码体现上
class Company{
List<Employe> employes;
public Company(List<Employe> employes){
this.employes = employes
}
...
}
明显可知:
聚合类的构造函数中包含了另一个类作为参数
部分类可以脱离整体类而独立存在
组合 – composition
比聚合更强的整体与部分的关系
通常整体和部分都不能独立存在,必须要组合到一起存在,例如 人和头,汽车和变速器。
图例中使用实心菱形+实线+箭头(箭头可选)表示,如图
代码体现上
class Car {
Transmission transmission //变速器
public Car(){
transmission = new Transmission();
}
}
组合类的构造函数中包含了另一个类的实例化,表明汽车类在实例化之前,一定要先实例化变速器类,这两个类紧密的耦合在一起,同生共灭。变速器类是不可以脱离汽车类而独立存在