在java开发中,有很多时候我们是在不断的处理类与类之间关系,其中这六种关系是:依赖、关联、聚合、组合、继承、实现.

它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合<泛化(继承)

类是对象的集合,展示了对象的结构以及与系统的交互行为。类主要有属性(Attribute)和方法(Method)构成,属性代表对象的状态,如果属性被保存到数据库,此称之为“持久化”;方法代表对象的操作行为,类具有继承关系,可以继承于父类,也可以与其他的Class进行交互。

依赖

在实际生活中我们做任何一件事情几乎都需要借助其他物体的帮助,换句话说,我们依赖于其他的物体生活。比如:小明要开车,小明要吃饭,小明要生活等等,不难想象出依赖关系是现实世界中最普通的关系。对于以面向对象为思想的语言世界来说,依赖也是最普遍和常见的关系。

在代码层次上,依赖关系多表现为函数的参数.

public class Person{
public void drive(Car car){
//
}
}

关联(Association)

如果说依赖关系讲求的临时性,偶然性的话,那么关联关系则是一种持久性的关系。为什么这么说呢? 小明吃饭借助筷子,这种关系只存在小明吃饭的情况下,一旦小明不吃饭了,那么这种依赖关系也就终止了。 与依赖关系不同,关联对象的双方地位同级,存在长期,固定的对应关系,即关联是一种强依赖。关联关系共分为两种:单向关联和双向关联。所谓单向关联通俗点讲就是“你中有我,但我中未必有你”,比如小明拥有一辆车(注意和小明开车进行区分),但车这个对象可不拥有你啊。和单向关联相对应的是双向关联,也即是”你中有我,我中有你”,比如夫妻就是一种双向关联.

在代码层次上,关联关系表现为对象作为另一个类的成员变量.

单向关联

public class Person{
private Car car;
public void setCar(Car car){
this.car=car;
}
}

双向关联

public class Husband{
private Wife wife=new Wife(); public void say(){
System.out.println("my wife name:"+wife.getName());
} } public class Wife{
private Husband husband=new Husband(); public void say(){
System.out.println("my husband name:"+husband.getName());
} }

聚合关系(Aggregation)

• 聚合关系(Aggregation) 表示一个整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类和成员类之间就形成了聚合 关系。
• 在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示

聚合关系是一种强关联关系,两者之间最主呀的区别是在语意上:聚合之间的关系更像是”整体-部分”,有点组装的含义,而关联关系的对象间是相互独立的,不存在组装关系.
在现实世界中,分子是由原子组成的,汽车是由各种零部件组成的等,这都是聚合关系的最好说明.这里要注意,组成A类型分子的原子也可以组成B类型的分子,这说明什么呢?也就是部分可以单独存在,换句话说就是整体和部分两者的生命周期不是同步的.比如:水分子是由氧原子和氢原子组成的,你不能说没有水分子就没有氧原子和氢原子吧.

在代码层次上,聚合和关联两者的形式一致,都表现为成员变量.

public class Car{
private Tyre tyre;
private Engine engine; public void setTyre(Tyre tyre){
this.tyre=tyre;
} public void setEngine(Engine engine){
this.engine=engine;
}
}

有些人写成以下样子:

public class Car{
private Tyre tyre=new Tyre();
private Engine engine=new Engine(); }

咋眼一看在代码层次上符合啊,那这算不算是聚合关系呢?首先呢,我们肯定的说这是聚合关系.但仅仅是形势上聚合的关系.为什么这么说呢?

我们从真实世界中抽象汽车这个概念,进而将其转化为软件世界中的Car,这也是java中提倡的面向对象编程的,但是呢,在从真实世界到软件世界的这个过程中需要保证物体静态属性和动态属性没变.什么意思呢,换言之就是,你将真实世界中的汽车转成换成软件世界中Car,反过来,也要保证从软件世界中Car能够转换成真实世界中的汽车.如果不能保证转换的一致性,那么就说明,抽象过程中出现了问题.

现在将上边的代码中的Car转成现实世界中的汽车,我们发现转换后的汽车竟然不能换车轮了?这可能吗?很显然,在对抽象汽车到Car这个类的过程中出现了问题.那么应该怎么样的呢?
除了一开始我们写的那样,还可以如下:

public class Car{
private Tyre tyre=new Tyre();
private Engine engine=new Engine(); public void setTyre(Tyre tyre){
this.tyre=tyre;
} public void setEngine(Engine engine){
this.engine=engine;
}
}

组合

组合关系(Composition)也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之 间具有同生共死的关系。
在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。

组合和聚合非常类似,都表示的”整体-部分”,但是组合要求整体和部分的生命周期是同步的,部分不能脱离整体而存在.不难发现,组合是一种强聚合关系.比如,人这个生命体由不同器官构成,其中我们拿心脏来说一下,人要活着必须依靠心脏,心脏不能脱离人这个生命体,两者一旦分开,都会死亡.
在代码层次上,通常表现为类的成员变量,除此之外还要求这个成员变量在构造函数中创建.

public class People{
private Heart heart; public People(){
heart=new Heart();
}
}

到现在我们从微观的角度了解依赖,关联,聚合和组合这四种关系,从宏观上来说,这四种关系体现的都是对象与对象之间的依赖,因此在某些方面,我们也同依赖来涵盖这四种关系.在很多文章中,并没有说到这一点,这也造成,很多情况下,大家对这几个概念探地的时候感到很疑惑.

聚合和组合的区别在于:

聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。

另外有一个差别是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象可以被多个整体对象聚合,例如一个学生可以在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。

从真实世界中来看,对象与对象之间的关系其实可以分为两类,一是上边宏观所说的依赖,另一种则是我们下面要谈的泛化

泛化

在开始解释泛化之前,先来从extends说起:

extends的意思是延伸,扩展,继承.从这个词的角度来说,子类应该分为两层意思:

一种是增强原有类的功能,这体现的不是生物界的”父与子”关系.比如我现在拥有一个工具类Tools,现在我想要增强该工具类,按照开闭原则,我定义了UpdateTools extends Tools,此时你就不能说UpdateTools是Tools的”孩子”,因为你发现这里的UpdateTools仅仅是增强原有Tools类的功能,作为功能扩展类来的.此时,我们称其为扩展比较合适.

另一种则就是体现生物界的”父与子”,即子类和父类在某些行为或者属性的表现不一样.这时候,用单词inherit来表示更合适,也就是我们常说的继承的意思.

到现在,相信你已经明白了extends的含义.其实,实际中,我们使用继承的目的就是为了扩展,因此,可不做深究.

下面我们在来说泛化.
泛化表示一个类(父类或接口)与其一个或者多个变体之间的关系.简单的来说泛化表示类与类之间的扩展,接口与接口的扩展,类与接口之间的实现关系.
在java中用extends来表示扩展,用implements表示实现关系.

扩展:

public class Tools{
public void print(){
//do
}
} public class UpdateTools extens Tools{
public void printError(){
//do
| }

继承:

public class Father{
public void getName(){
//do
}
} public class Son extens Father{
public void other(){
//do
}
}

实现:

接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现关系(Realization),在这种关系中,类实现了接口,类中的操作实现了接口中所 声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。

public interface UserService{
void execute();
} public class UserServiceImpl implements UserService{ @override
void execute(){
//do
}
}

---------------------
作者:江湖人称小白哥
来源:CSDN
原文:https://blog.csdn.net/dd864140130/article/details/51339626
版权声明:本文为博主原创文章,转载请附上博文链接!

UML相关说明的更多相关文章

  1. UML相关汇总

    类图 类图是UML最常用的图之一,用于描述面向对象程序设计中,类.接口等结构之间的关系,如图 类图中涉及到以下几种类型的对象 UMLClass 如图中Class1,代表类 UMLOperation 如 ...

  2. 初识UML

    最近的学习中,遇到几次UML图,很是迷糊,确切的说,看不太懂.查阅UML相关资料,基本解决了这个问题.UML看起来还是相当深奥,这里只提一下解决问题的部分知识.(以下知识来自网络) Unified M ...

  3. [转]UML八大误解

    潘加宇 本文删节版发表于<程序员>2013年11期 UML(统一建模语言)是软件建模的表示法标准.我从2002年开始专门从事研究和推广UML的工作,在为软件组织提供UML相关需求和设计技能 ...

  4. 使用UML进行项目开发

    一.概述 本文主要论述的内容是如何使用UML来指导(辅助)项目设计.在此篇文章中,假设读者对UML已经有了概念上的认识,对UML中出现的名词都能很好的理解. UML的目标是以面向对象图的方式来描述任何 ...

  5. UML学习-总体概念篇

    前言:我们在实施一个项目时,前期的设计是非常重要的,如建筑师在建造一个建筑时,需要事先设计图纸,设计图纸是设计的语言,是不同的工程设计人员.设计人员和生产人员之间进行沟通的语言,在一个现代化的工程里面 ...

  6. 统一建模语言(UML) 版本 2.0

    原文: http://www.ibm.com/developerworks/cn/rational/321_uml/ 简介 参考 UML 基础系列的其他文章和教程 UML基础: 统一建模语言简介 UM ...

  7. UML 2中结构图的介绍

    原文: http://www.ibm.com/developerworks/cn/rational/rationaledge/content/feb05/bell/ 这是关于统一建模语言.即UML 里 ...

  8. IntelliJ IDEA之UML类图

    IntelliJ IDEA之UML类图 生成方法 Show Diagrams 选中需要的类,右键单击Diagrams,之后点击Show Diagrams,或者快捷键Ctrl+Alt+Shift+U 生 ...

  9. 移动架构师第一站UML建模

    回想一下自己的Android生涯已经经历过N多个年头了,基本都是在编写业务代码,都知道35岁程序员是一个坎,当然如果有能力能做到Android架构师的职位其生命周期也会较长,毕境不是人人都能轻易做到这 ...

随机推荐

  1. Linux 重定向输出到多个文件中

    转自:http://codingstandards.iteye.com/blog/833695 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们 ...

  2. (转)解决点击a标签返回页面顶部的问题

    本文转载至http://www.cnblogs.com/chenluomenggongzi/p/5950670.html 1 <!DOCTYPE html> 2 <html lang ...

  3. MySQL二进制安装部署

    #使用二进制包安装mysql -linux-glibc2.-x86_64.tar.gz /data/ -linux-glibc2.-x86_64.tar.gz -C /data/ -linux-gli ...

  4. BZOJ3620 似乎在梦中见过的样子(kmp)

    不是很懂为什么数据范围要开的这么诡异,想到正解都不敢写.用类似NOI2014动物园的方法,对每个后缀求出类似next的数组即可. #include<iostream> #include&l ...

  5. [AT2000] [agc002_f] Leftmost Ball

    题目链接 AtCoder:https://agc002.contest.atcoder.jp/tasks/agc002_f 洛谷:https://www.luogu.org/problemnew/sh ...

  6. 使用Unity5.1进行VR开发的配置(最新的未必是最好的!!!)

    随着Unity5.1的发布,之前的Oculus Rift和Gear VR 开发流程发生了巨大的变化,这也算是小白鼠们必须付出的代价了~ 那么Unity5.1和Oculus的整合究竟发生了哪些变化,对开 ...

  7. Codeforces Round #406 (Div. 2)滚粗记

    A 一看到题,不是一道解不定方程的裸题吗,调了好久exgcd. 其实一个for就好了啊 B 一直WA ON TEST 7真是烦,一想会不会是编号太大了,又写了一个map版本,无用. 调了好久好久才发现 ...

  8. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  9. POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

    POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...

  10. nginx php fastcgi Connection reset by peer的原因及解决办法

    Connection reset by peer 这个错误是在nginx的错误日志中发现的,为了更全面的掌握nginx运行的异常,强烈建议在nginx的全局配置中增加 error_log   logs ...