类图
类图的构成
1.类
2.接口:没有给出对象的实现和状态的情况下对对象行为的描述,描述了类或组件对外的、可见的动作。
3.协作:表示一些角色和其他元素一起工作,提供一些合作的动作。一个给定的类可能是几个协作的组成部分。
4.关系:包括关联关系、依赖关系、泛化关系和实现关系。
5.包或子系统
包的作用:①将那些语义相近并倾向于一起变化的元素进行分组,方便理解和处理整个模型;②构成一个命名空间
类的关系
类之间的关系分为4种:关联、依赖、泛化和实现。下面分别介绍这四种关系:
1.关联
关联又分为:普通关联、自身关联、聚合关系和组合关系。
1)普通关联用直线表示,除此之外关联的修饰还有:关联名、角色、多重性等。比如下图:
关于多重性有好几种:
![多重性示例](https://i-blog.csdnimg.cn/blog_migrate/609a3d6e2e67850c80a12b55ca831989.png)
普通关联又可分为:单向关联和双向关联。
①单向关联:其中有一端带有箭头,意味着被指向的一端的对象可以被另一端的对象访问。
②双向关联:两端都加箭头或者两端都不加箭头
2)自身关联
自身关联指的是一个对象与一个同类对象有链接,比如:节点,每个节点属于同一类,且每个节点都有前驱节点和后继节点,即每个节点都要和其他节点有联系,那么这种关联就叫做自身关联。而普通关联一般指的是不同类之中的关联。(如果不明白,请看下图:)
3)聚合关系
聚合关系用空心菱形表示,菱形靠近整体部分。
聚合关系表示的是一种松耦合关系,整体和部分可以独立存在。比如:汽车和发动机、大雁和雁群。
4)组合关系
组合关系用实心菱形表示。
组合关系表示的是一种强耦合关系,部分不可以脱离整体而单独存在。比如:鸟和翅膀、链表和节点之间的关系。只要整体消失,那么部分也随之消失。
★问:既然都是表示整体与局部,那么为什么还要分聚合和组合呢?
①画类图的时候要用最准确的方式来表达。
②编程实现时,这两种关系的实现手段截然不同。编程时,不仅要告诉程序员是整体和局部的关系,还要告诉他们整体与局部的生命约束关系,从而在编程的时候用不同的方法来实现。
2.依赖关系:用虚线+箭头表示。
依赖关系表示的是一种使用关系,当某一个类需要用到另一个类中的属性或方法时,就用依赖关系。
3.泛化关系:用实线+空三角形表示。
泛化关系表示的是继承关系。
4.实现关系:用虚线+空三角形表示。
实现关系通常用于类和接口,表示一个类实现了一个接口。
★类和接口的区别:接口没有属性,而且只给出了要实现的方法名,而没有给出具体的代码实现;而类不仅有属性和操作,还给出了方法的具体实现。
类图的讨论和应用
1.可见性
类之中有属性和操作,由于类的封装性,所以就出现了属性和操作的可见性。
可见性有:公有、私有、保护等几种。在 Rational Rose 画图中有两种表示方法:
1)用图标表示
2)用符号表示
可见性 | 符号表示 |
---|---|
Public(公有) | + |
Private(私有) | - |
protect(保护) | # |
package(包) | ~ |
2.范围
静态成员:一个类的所有实例共享一个成员,而不是每一个实例化的对象的属性都不同。
静态成员的两种用法:①计数器 ②静态成员通过类名调用,与具体实例无关。
3.类图需要注意的问题:
1)抽象类不能实例化,类名用斜体表示
2)类图之间的关系一定要运用准确,能用组合就不要用聚合,能用聚合就不要用关联,能用关联就不要用依赖。
示例
对象图
对象图表示类图在某一个时刻一组对象以及它们之间关系的图。
对象图的作用:在复杂的系统中,出错时涉及的对象可能处于一个具有众多类的关系网中,分析出错的原因的时候就会很复杂,因此测试员可以在出错时刻建立对象图,这将大大方便分析错误,解决问题。