在uml图中 最复杂的也就是泛化,实现。依赖,关联。这四种关系了,假设弄清了这几种关系那么在理解UML图的时候就会变得轻车熟路了!

假设你对着几种关系一点都不熟悉的话能够看一下uml中的四种关系。这篇博客简单的介绍了一下这几种关系,本文将重点的介绍一下,这几种关系在代码里怎样实现的。

泛化关系

我想这个也可能是最简单的关系了。泛化就是特殊到一半的过程,也就是继承的相反的过程,子类继承自父类。而父类是从子类泛化而来。

泛化(generalization)关系是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并能够添加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过keywordextends明白标识,在c#中用:来表示。

在设计时一般没有争议性。

<span style="font-size:18px;">namespace DEMO
{
//类继承类
class ClassB: ClassA { }
//接口继承接口
interface InterfaceB: InterfaceA { }
}</span>

实现关系

实现(realization)关系指的是一个class类实现interface接口(能够是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过keywordimplements明白标识,在c#中用“:”表示在设计时一般没有争议性。

<span style="font-size:18px;">namespace DEMO
{
//类实现接口
class ClassC:InterfaceC{ }
}</span>

依赖关系

依赖(dependency)关系: 也是类与类之间的连接. 表示一个类依赖于还有一个类的定义. 依赖关系总是单向的 。

能够简单的理解,就是一个类A使用到了还有一个类B,而这样的使用关系是具有偶然性的、、暂时性的、很弱的,可是B类的变化会影响到A;比方某人要过河,须要借用一条船,此时人与船之间的关系就是依赖;表如今代码层面,为类B作为參数被类A在某个method方法中使用。或者在方法体重声明该类的变量,或者直接引用该类!

public class Boat {
/// <summary>
/// 过河
/// </summary>
public voidriverCrossing(){
//启动
//过河
}
public staticvoid riverCrossingByShip(){
//用大 船过河
} }//end Boat public class Person {
//通过參数的形式用Bote 类
//Bote类被Person类的一个方法所持有,生命周期随着方法运行结束而结束。
/// <summary>
/// 过河
/// </summary>
/// <paramname="bote">船的实例</param>
public voidriverCrossing(Boat bote){
bote.riverCrossing();
}
//在方法体重生命该类的变量
//注意Bote类的生命周期。当riverCrossing方法被调用的时候。才被实例化。
//持有Bote类的是Person类的一个方法,而不是Person类,这点是最重要的。
public voidriverCrossing() {
Boatbote = new Boat();
bote.riverCrossing();
}
//直接应用该类
public voidriverCrossing() {
Boat.riverCrossingByShip();
} }//end Person

关联关系

       关联关系是实线加箭头表示。

表示类之间的关系比依赖要强。

比如。水和气候是关联的,表演示样例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdob25namllMDMwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

在代码中的表现例如以下:

<span style="font-size:18px;">namespace DEMO
{
/// <summary>
/// 水
/// </summary>
class Water
{
//吧气候类 的实例作为该类的一个变量!
public Climateclimate;
publicWater() {
}
}
/// <summary>
/// 气候
/// </summary>
class Climate
{
publicClimate()
{
}
}
}</span>

可见,在Water类属性中添加了Climate类。

关联关系有单向关联、双向关联、自身关联、多维关联等等。

当中后三个能够不加箭头。

单向关联:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdob25namllMDMwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

双向关联:

自身关联:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdob25namllMDMwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

多维关联:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdob25namllMDMwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

关联和依赖的差别:

       从类的属性是否添加的角度看:

       发生依赖关系的两个类都不会添加属性。

当中的一个类作为还有一个类的方法的參数或者返回值,或者是某个方法的变量而已。

      发生关联关系的两个类,当中的一个类成为还有一个类的属性。而属性是一种更为紧密的耦合。更为长久的持有关系。

从关系的生命周期来看:

       依赖关系是仅当类的方法被调用时而产生。伴随着方法的结束而结束了。

关联关系是当类实例化的时候即产生,当类销毁的时候。关系结束。相比依赖讲,关联关系的生存期更长。

       关联关系按关系强弱右分为聚合 和组合 。下边用大雁和雁群的样例解说一下!

大雁喜欢热闹害怕孤独。所以它们一直过着群居的生活,这样就有了雁群,每一仅仅大雁都有自己的雁群,每一个雁群都有好多大雁,大雁与雁群的这样的关系就能够称之为聚合。

       另外每仅仅大雁都有两仅仅翅膀。大雁与雁翅的关系就叫做组合。

由此可见:

聚合的关系明显没有组合紧密,大雁不会由于它们的群主将雁群解散而无法生存;

而雁翅就无法脱离大雁而单独生存——组合关系的类具有同样的生命周期。

聚合关系图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdob25namllMDMwMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

组合关系图:



 在代码中表现例如以下:

<span style="font-size:18px;">namespace DEMO
{
/// <summary>
/// 雁群
/// </summary>
class GooseGroup
{
public Goosegoose;
publicGooseGroup(Goose goose) {
this.goose= goose;
}
}
/// <summary>
/// 大雁
/// </summary>
class Goose
{
publicWing wing;
publicGoose() {
wing = new Wing();
}
}
}</span>

这两种关系的差别是:

1.构造函数不同

        聚合类的构造函数中包括还有一个类的实例作为參数

        由于构造函数中传递还有一个类的实例,因此大雁类能够脱离雁群类独立存在。

组合类的构造函数包括还有一个类的实例化

        由于在构造函数中进行实例化,因此两者紧密耦合在一起。同生同灭。翅膀类不能脱离大雁类存在。

2.信息的封装性不同

        在聚合关系中,client能够同一时候了解GooseGroup类和Goose类,由于他们是独立的。

在组合关系中。client仅仅认识大雁类。根本不知道翅膀类的存在,由于翅膀类被严密地封装在大雁类中。

总结:

对于继承、实现这两种关系没多少疑问。他们体现的是一种类与类、或者类与接口间的纵向关系。其它的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比較难区分的。有非常多事物间的关系要想准备定位是非常难的,前面也提到。这几种关系都是语义级别的,所以从代码层面并不能全然区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>依赖。

UML中类图的四种关系及其代码实现的更多相关文章

  1. UML中类之间的几种关系

    类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...

  2. 浅谈UML中类之间的五种关系及其在代码中的表现形式

    本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html 什么是类? 将某类东西归纳在一起,可以成为一个类. 类有很多种 ...

  3. [UML] UML中类之间的几种关系

    类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...

  4. uml类图的几种关系

    UML类图几种关系的总结   在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregati ...

  5. UML类图的几种关系总结【转】

    在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregation),组合(Composit ...

  6. UML中类图(Class Diagram)的关系整理

    什么是UML类图? 类图显示了一组类.接口.协作以及他们之间的关系.在UML中问题域最终要被逐步转化,通过类来建模,通过编程语言构建这些类从而实现系统.类加上他们之间的关系就构成了类图,类图中还可以包 ...

  7. UML类图的几种关系总结

    本文摘自:UML类图关系总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregati ...

  8. 【转】UML类图符号 6种关系说明以及举例

    转自http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html UML中描述对象和类之间相互关系的方式包括:依赖(Dependency) ...

  9. UML 之 四种关系

    学习过UML的人都知道,UML之中有九种图和四种关系,今天,我们先来介绍一下这四种关系: 对于我们这些初学者来说,UML之中无非是  关联.依赖.泛化和实现,但是其中,关联和依赖又如何区分?泛化又如何 ...

随机推荐

  1. Echarts和Quartz简介

    一.Echarts ​ ECharts 是由百度前端团队开发的一款开源的基于 js 图形报表组件,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大 ...

  2. [ CodeForces 1059 D ] Nature Reserve

    \(\\\) \(Description\) 你现在有\(N\)个分布在二维平面上的整点\((x_i,y_i)\),现在需要你找到一个圆,满足: 能够覆盖所有的给出点 与\(x\)轴相切 现在需要你确 ...

  3. FCC 基础JavaScript 练习7

    1. Math.random()用来生成一个在0(包括0)到1(不包括1)之间的随机小数,因此Math.random()可能返回0但绝不会返回1. 提示随后的函数都会在return执行前调用,所以我们 ...

  4. Smarty的应用

    smarty模板的核心是一个类,下载好的模板中有这么几个重要的文件夹 (1)libs核心文件夹(2)int.inc.php这是入口文件(3)plugins:自己写的插件文件夹(4)templates_ ...

  5. 【译】x86程序员手册24-第7章 多任务

    Chapter 7 Multitasking 多任务 To provide efficient, protected multitasking, the 80386 employs several s ...

  6. HWND CWND 转换

    一.区别HWND是句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd.HWND是Windows系统中对所有窗口的一种标识,即窗口句柄.这是一个SDK概念.   CWnd是M ...

  7. NOIP2016 DAY1 T2天天爱跑步

    传送门 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一一棵包含 ...

  8. 面试总结——Java高级工程师(一)

    一.无笔试题 不知道是不是职位原因还是没遇到,面试时,都不需要做笔试题,而是填张个人信息表格,或者直接面试 二.三大框架方面问题 1.Spring 事务的隔离性,并说说每个隔离性的区别 解答:spri ...

  9. AWK简单使用方法

    1. 命令格式 gawk [OPTIONS] 'program' FILES.... program:'PATTERN{ACTION}' 一条awk命令中,PATTERN和ACTION,至少存在一个才 ...

  10. Linux命令学习(2): scp和rsync基本用法与断点续传

    版权声明:本文为博主原创文章,未经允许不得转载. 引子 在平常的工作中,我经常需要在远程服务器和本地之间传输文件. 以前我都使用scp命令,直到今天因为网络中断,scp出现了stalled. 因为上传 ...