UML之用例图(use case)箭头方向

1、Association,无箭头,Actor连接UseCase即可;

2、DirectedAssocition,Actor连接UseCase,箭头由Actor指向UseCase(角色指向用例);

3、Generalization,继承,我把它念成“继承于”,当然是箭头由子指向父啦; 
4、Dependency,我念成“依赖于”,就知道箭头方向了;

5、Include,我念成“包含了”,箭头由包含者指向被包含者; 
6、Extend,我念成“扩展于”或“扩展自”,箭头由扩展出来的“子”指向它的“父”; 


总结:除了包含方向外,其它都是“小”的指向“大”的,“子”指向“父”,“一般”指向“抽象”。

 

UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。

  • 依赖Dependency:元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素。
  • 泛化(Generalization:通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了。uml中用带空心箭头的实线线表示Generalization关系,箭头指向一般个体。
  • 实现(Realize:元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。uml中用空心箭头和虚线表示Realize关系,箭头指向定义约定的元素。
  • 关联(Association:元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。uml中用实线表示Association关系,箭头指向被依赖元素。
  • 聚合(Aggregation:关联关系的一种特例,表示部分和整体(整体 has a 部分)的关系。uml中用带空心菱形头的实线表示Aggregation关系,菱形头指向整体。
  • 合(Composition:组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。uml中用带实心菱形头的实线表示Composition关系,菱形头指向整体。

1.1.1       依赖(Dependency):虚线箭头表示

1、依赖关系也是类与类之间的联结
2、依赖总是单向的。(#add 注意,要避免双向依赖。一般来说,不应该存在双向依赖。)
3、依赖关系在 Java 或 C++ 语言中体现为局部变量、方法的参数或者对静态方法的调用。

(软件开发中,往往会设计一些公用类,供别的类调用,如果这些公用类出问题了,那调用这些公用类的类都会因此而出问题。 
两个元素之间的一种关系,其中一个元素(提供者)的变化将影响另一个元素(客体),或向它提供所需信息
显示一个类引用另一个类)

方法参数示例:

复制代码

public class Person
{void buy(Car car){...}
}

复制代码

表示方法:虚线加箭头

特点:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。

依赖关系可以分为以下四类:

1)  使用依赖(Usage)表示客户使用提供者提供的服务以实现它的行为,包括:

  • 使用<<use>>--声明使用一个类时需要用到已存在的另一个类。
  • 调用<<call>>--声明一个类调用其他类的操作的方法。
  • 参数<<parameter>>--声明一个操作和它的参数之间的关系。
  • 发送<<send>>--声明信号发送者和信号接收者之间的关系。
  • 实例化<<instantiate>>--声明用一个类的方法创建了另一个类的实例。

2)  抽象依赖(Abstraction)表示客户与提供者之间用不同的方法表现同一个概念,通常一个概念更抽象,一个概念更具体。包括:

  • 跟踪<<trace>>--声明不同模型中的元素之间存在一些连接但不如映射精确。
  • 精化<<refine>>--声明具有两个不同语义层次上的元素之间的映射。
  • 派生<<derive>>--声明一个实例可以从另一个实例导出。

3)  授权依赖(Permission)表达提供者为客户提供某种权限以访问其内容的情形。包括:

  • 访问<<access>>--允许一个包访问另一个包的内容。
  • 导入<<import>>--允许一个包访问另一个包的内容并为被访问包的组成部分增加别名。
  • 友元<<friend>>--允许一个元素访问另一个元素,不管被访问的元素是否具有可见性。

4)  绑定依赖(Binding)较高级的依赖类型,用于绑定模板以创建新的模型元素,包括:

  • 绑定<<bind>>--为模板参数指定值,以生成一个新的模型元素。

 

1.1.2       关联(Association):实线箭头表示

1、关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法。
2、关联可以是双向的,也可以是单向的(#add还有自身关联)。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。
3、在 Java 或 c++ 中,关联关系是通过使用成员变量来实现的。

复制代码

public class 徒弟
{  }public class 唐僧
{protected: list<徒弟> tdlist;
}

复制代码

表示方法:实线箭头

特征:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示。(A类有一个成员变量保存的是B类的一个引用,也就是说由A类可以找到B类)

1.1.3       聚合(Aggregation):带空心菱形头表示

1、聚合关系是关联关系的一种,是强的关联关系。
2、聚合是整体和部分之间的关系,例如汽车由引擎、轮胎以及其它零件组成。
3、聚合关系也是通过成员变量来实现的。但是,关联关系所涉及的两个类处在同一个层次上,而聚合关系中,两个类处于不同的层次上,一个代表整体,一个代表部分。
4、关联与聚合仅仅从 Java 或 C++ 语法上是无法分辨的,必须考察所涉及的类之间的逻辑关系。

复制代码

public class 引擎{}
public class 轮胎{}
public class 汽车
{protected:引擎 engine;protected:轮胎 tyre[4];
}

复制代码

表示方法:空心菱形头

特征:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;

1.1.4       组合(Composition):带实心菱形头的实线表示

1、合成关系是关联关系的一种,是比聚合关系还要强的关系。
2、它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

复制代码

class 肢{}class 人{protected:  肢   limb[4];}

复制代码

表示方法:一般是实心菱形加实线箭头表示

特征:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;

1.1.5       泛化(Generalization):

带空心箭头的实线线表示

泛化(下图)表示一个更泛化的元素和一个更具体的元素之间的关系。泛化是用于对继承进行建模的UML元素。在Java中,用extends关键字来直接表示这种关系。

泛化关系表示类与类之间的继承关系,接口与接口之间的继承关系。如下图:

1.1.6       实现(Realization):空心箭头和虚线表示

实例(I)关系指定两个实体之间的一个合同。换言之,一个实体定义一个合同,而另一个实体保证履行该合同。对Java应用程序进行建模时,实现关系可直接用implements关键字来表示。表达一种说明元素与实现元素之间的关系;

图I

 

二、相互之间的区别

1.聚合与组合

(1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。

(2)部件的生命周期不同

聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。 
组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。

(3)聚合关系是“has-a”关系,组合关系是“contains-a”关系。

  • “弱”包含表示如果部门没有了,员工也可以继续存在;
  • “强”包含表示如果部门没有了,员工也不再存在;

在做软件需求时,往往会将所有的包含关系画成“弱”包含,后面发现某些关系可以表示为“强”包含是,才转为实心菱形。

2.关联和聚合

(1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

(2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。

(3)关联是一种结构化的关系,指一种对象和另一种对象有联系。

(4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

3.关联和依赖

(1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

(2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。

4.泛化和实现

实现表示类对接口的实现关系,表示方式:用一条带有空心三角箭头的虚线指向接口。

泛化表示类与类之间的继承关系、接口与接口之间的继承关系,表示方式一条带有空心三角箭头的实线指向基类(父接口)。

5.综合比较

  这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:

          组合>聚合>关联>依赖

  其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。

而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。

 

 

 

 

 

  1. 泛化(Generalization)

      【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:马是动物的一种,即有马的特性也有动物的共性。

    【箭头指向】:带三角箭头的实线,箭头指向父类

    UML类图几种关系的总结(图文并茂、案例详解)

  2. 2

    实现(Realization)

            【实现关系】:是一种类与接口的关系,它表示不继承结构而只继承行为,是类与接口之间最常见的关系。准确的说,类不是继承(inherit)接口,而是实现(implement)接口。

            【箭头指向】:UML中用带三角箭头的虚线,箭头指向接口

    UML类图几种关系的总结(图文并茂、案例详解)

  3. 3

    关联(Association)

            【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

            【代码体现】:成员变量

            【箭头及指向】:单向关联为带普通箭头的实心线,箭头指向被拥有者,如下图

    图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。 

    UML类图几种关系的总结(图文并茂、案例详解)

  4. 4

    聚合(Aggregation)

            【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。

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

            【代码体现】:成员变量

            【箭头及指向】:带空心菱形的实心线,菱形指向整体

    UML类图几种关系的总结(图文并茂、案例详解)

  5. 5

    组合(Composition)

            【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。如线段和点是整体和部分的关系,没有点就不存在线段。

           组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期。

    【代码体现】:成员变量

    【箭头及指向】:带实心菱形的实线,菱形指向整体

    UML类图几种关系的总结(图文并茂、案例详解)

  6. 6

    依赖(Dependency)

            【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.

         【依赖扩展】:Trufun Plato工具根据实际开发中的需要,在工具箱还提供两个预定义的依赖:许可(permission)依赖和使用(usage)依赖。

    l 许可依赖(通常作为特定的构造类型)将包或者类与另一个允许它使用某些内容的包或者类相连。许可依赖关系的构造类型有访问、友元、输入。

    l 使用依赖关系(关键字《use》)将客户元素与服务者元素相连。服务者的变化将导致客户的变化。使用通常表示一种实现的依赖关系,其中的一个元素依靠另一个元素的服务来实现自身的操作。使用的构造类型包括调用、实例(关键字《instantiate》)、参数、发送。

            【代码表现】:局部变量、方法的参数或者对静态方法的调用

            【箭头及指向】:带箭头的虚线,指向被使用者

    UML类图几种关系的总结(图文并茂、案例详解)

  7. 7

    各种关系的强弱顺序:

            泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖 

            下面这张UML图,比较形象地展示了各种类图关系:

    UML类图几种关系的总结(图文并茂、案例详解)

  8. 8

    如有不完善之处,希望大家多多补充,让我们的学习互助起来。让我们的经验分享起来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML-记忆技巧

箭头方向 UML箭头方向&#xff1a;从子类指向父类&#xff0c;读作继承自定义子类时需要通过extend关键字指定父类子类一定时知道父类定义的&#xff0c;但父类并不知道子类的定义 只有知道对方信息时才能指向对方 image.png 实现-继承|虚线-实现 空心三角箭头&#xff1…

国密算法SM2,SM3,SM4-java实现

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法&#xff0c;基于ECC。其签名速度与秘钥生成速度都快于RSA&#xff0c;非对称加密&#xff0c;该算法已公开 SM3是中华人民共和国政府采用的一种密码散列函数标准&#xff0c;由国家密码管理局于2010年12月17日…

数据库事务隔离级别-- 脏读、幻读、不可重复读(清晰解释)

一、数据库事务隔离级别 数据库事务的隔离级别有4个&#xff0c;由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable &#xff0c;这四个级别可以逐个解决脏读 、不可重复读 、幻读 这几类问题。 √: 可能出现 : 不会出现 脏读不可重复读幻…

原子性和一致性的区别是什么?

注&#xff1a; 重度参考了&#xff1a;https://www.zhihu.com/question/30272728/answer/72476703&#xff08;讲的非常好&#xff0c;逻辑清晰&#xff09; 轻度参考了&#xff1a;https://www.cnblogs.com/fjdingsd/p/5273008.html&#xff08;概念也比较清晰&#xff0c;…

什么是事务、事务特性、事务隔离级别、spring事务传播特性

1.什么是事务&#xff1a; 事务是指程序中的一个操作序列。其特点是&#xff1a;该序列的所有操作要么全部成功完成&#xff0c;要么只要有一个操作失败&#xff0c;则该序列所有操作都将被撤销。这也是事务的原子性&#xff08;要么成功&#xff0c;要么失败&#xff09;。 …

软件工程 – 开发模型

软件工程 – 开发模型 为了指导软件开发&#xff0c;可以用不同的方式将软件生命周期中的所有开发活动组织组织起来从而形成不同的开发模型。 瀑布模式 瀑布模型严格遵守软件生命周期各阶段的固定顺序:计划、分析、设计、编程、测试和维护&#xff0c;上一阶段完成才能进入到…

排序算法之选择排序

动图演示 使用场景:适用于大多数排序,数据量大效率明显优于冒泡 java代码实现 import java.util.Arrays;/*** 选择排序*/ public class SelectSort {private static int[] selectSort(int[] arr) {if (arrnull||arr.length<2){return arr;}//控制循环次数,最后一个元素不用…

VS的包含目录、库目录、引用目录、可执行目录解释

来源&#xff1a;包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解 学习备份 VS项目中的包含目录、库目录、附加包含目录、附加库目录、附加依赖项均在”项目->属性->配置属性”下进行配置&#xff0c;具体说明如下&#xff1a; VC目录&#xff1a; 包含目…

排序算法之插入排序

动图演示 使用场景:数据有序程度越高,效率越高 java代码实现 import java.util.Arrays;/*** 插入排序*/ public class InsertSort {private static int[] insertSort(int[] arr) {if (arrnull||arr.length<2){return arr;}// 从下标为1的元素开始选择合适的位置插入&…

第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待。

一. 再谈委托 1. 委托是一个关键字为delegate的自定义类型&#xff0c;通过委托可以把方法以参数的形式传递给另外一个方法&#xff0c;实现插件式的开发模式&#xff1b; 同时调用委托的时候&#xff0c;委托所包含的所有方法都会被实现。 2. 委托的发展历史&#xff1a;new…

第二节:深入剖析Thread的五大方法、数据槽、内存栅栏。

一. Thread及其五大方法 Thread是.Net最早的多线程处理方式&#xff0c;它出现在.Net1.0时代&#xff0c;虽然现在已逐渐被微软所抛弃&#xff0c;微软强烈推荐使用Task(后面章节介绍)&#xff0c;但从多线程完整性的角度上来说&#xff0c;我们有必要了解下N年前多线程的是怎么…

HashMap和ConcurrentHashMap

HashMap: 线程不安全&#xff0c;不支持并发操作&#xff0c;键-值&#xff08;key-value&#xff09;都允许为空、、不保证有序 在 JDK1.7 中&#xff0c;HashMap 采用头插法插入元素&#xff0c;因此并发情况下会导致环形链表&#xff0c;产生死循环。 虽然 JDK1.8 采用了…

第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能

一. ThreadPool简介 ThreadPool简介&#xff1a;ThreadPool是一个线程池&#xff0c;当你需要开启n个线程时候&#xff0c;只需把这个指令抛给线程池&#xff0c;它将自动分配线程进行处理&#xff0c;它诞生于.Net 2.0时代。 ThreadPool与Thread的区别&#xff1a; ①&#xf…

第十节:进一步扩展两种安全校验方式

一. 简介 简介&#xff1a; 上一节中&#xff0c;主要介绍了JWT校验&#xff0c;它是无状态的&#xff0c;是基于Token校验的一种升级&#xff0c;它适用的范围很广泛&#xff0c;APP、JS前端、后台等等客户端调用服务器端的校验。本节补充几种后台接口的校验方式&#xff0c;它…

第十一节:WebApi的版本管理的几种方式

一. 背景和方案 1. 多版本管理的概念 Android 、IOS等 App 存在着多版本客户端共存的问题&#xff1a;App 最新版已经升级到了5.0 了&#xff0c;但是有的用户手机上还运行着 4.8、3.9 甚至2.2 版本的 App&#xff0c;由于早期没有内置升级机制、用户不会升级、用户拒绝升级等…

类加载器分类

类加载器干就是将对应类的.class文件中的二进制流加载到内存空间,只管加载&#xff0c;只要符合文件结构就加载&#xff0c;至于能否运行&#xff0c;它不负责 类加载器的分类 1.启动类加载器 2.扩展类加载器 3.应用程序类加载器 委托机制:双亲委派模型 当一个类加载的过…

第十二节:WebApi自动生成在线Api文档的两种方式

一. WebApi自带生成api文档 1. 说明 通过观察&#xff0c;发现WebApi项目中Area文件夹下有一个HelpPage文件夹&#xff0c;如下图&#xff0c;该文件夹就是WebApi自带的生成Api的方式&#xff0c;如果该文件夹没了&#xff0c;可以通过Nuget安装&#xff1a;Microsoft.AspNet.…

JVM 组成部分

JVM可以分为3大部分&#xff1a;类加载器&#xff0c;运行时数据区和执行引擎。 类加载器负责加载.class 文件 运行时数据区负责存放.class 文件&#xff0c;分配内存。运行时数据区又分为5个部分: 方法区&#xff1a;负责存放.class 文件&#xff0c;方法区里有一块区域是运…

第十三节:Asp.Net Core WebApi基础总结和请求方式-第十八节

一. 基础总结 1.Restful服务改造 Core下的WebApi默认也是Restful格式服务&#xff0c;即通过请求方式(Get,post,put,delete)来区分请求哪个方法&#xff0c;请求的URL中不需要写方法名。 但是我们不喜欢这种方式&#xff0c;所以我们将默认的路由规则 [Route("api/[contr…

第十四节:Asp.Net Core WebApi生成在线文档-第十九节

一. 基本概念 1.背景 使用 Web API 时&#xff0c;了解其各种方法对开发人员来说可能是一项挑战。 Swagger 也称为OpenAPI&#xff0c;解决了为 Web API 生成有用文档和帮助页的问题。 它具有诸如交互式文档、客户端 SDK生成和 API 可发现性等优点&#xff0c;目前有两种实现方…