本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html

什么是类?

将某类东西归纳在一起,可以成为一个类。

类有很多种提炼角度,需要根据系统地目标、业务的场景,选取合适的角度对事物进行归纳。

什么是类图?

类图可能是UML中使用的最多的一种图。

和其他图一样,类图的基本语法并不复杂,可能一两天就能掌握,但是真正做到灵活的使用类图,可能需呀多年的功力。

类图是锻炼OOA(OO Analysis)和OOD(OO Design)思想的重要工具,有助于OOA、OOD思想的提升。

本篇博文,重点讲述类图中类与类之间的关系以及这种关系在代码中的实现形式。写作本文的原因是:网上关于UML类图的语法规则等的资料很多,但是涉及到关系在代码中实现形式的文章却很少。这是很容易理解的:UML语法规范什么的各种书上导出都是,网页上的也很多都是对各种语法规范的Copy;而类之间的关系反应到代码层面需要加入个人的理解。两者的区别是一个不需要动脑子,Copy过来就行,而另一个需要动脑子。

类与类之间的关系

类与类之间的关系可以根据关系的强度依次分为以下五种:

依赖关系(Dependency)---关联关系(Association)---聚合(Aggregation)---组合(Composition)---泛化(Generalization)

1.依赖关系(Dependency)

依赖关系使用虚线加箭头表示,如下图所示:

这个例子可能不太好(Animal体内有Water,),换一个:

解释以下:Person 和 Computer之间是没有关系的,但是由于偶尔的需要,Person需要使用Computer,这时Person就依赖于Computer.

依赖关系是五种关系中耦合最小的一种关系。

类A要完成某个功能必须引用类B,则类A依赖类B。C#不建议双向依赖,也就是相互引用。

上述依赖关系在代码中的表现形式:这两个关系类都不会增加属性。

那么,Person类如何使用Computer类呢?有三种方式:

依赖关系的三种表现形式:

1.Computer类是public的,Person类可以调用它。

2.Computer类是Person类中某个方法的局部变量,则Person类可以调用它。代码如下:

Person有一个Programing方法,Computer类作为该方法的变量来使用。

注意Computer类的生命周期,当Programing方法被调用的时候,才被实例化。

持有Computer类的是Person类的一个方法,而不是Person类,这点是最重要的。

3.Computer类作为Person类中某个方法的参数或返回值。

Computer类被Person类的一个方法所持有,生命周期随着方法执行结束而结束。

在依赖关系中,必须使用这三种方法之一。

2.关联关系(Association)

关联关系是实线加箭头表示。表示类之间的关系比依赖要强。

例如,水和气候是关联的,表示如下:

在代码中的表现如下:

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

关联关系有单向关联、双向关联、自身关联、多维关联等等。其中后三个可以不加箭头。

单向关联:

双向关联:

自身关联:

多维关联:

关联和依赖的区别:

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

发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。

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

  • 从关系的生命周期来看:

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

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

3.聚合(Aggregation)

4.组合(Composition)

引用程杰的《大话设计模式》里举大那个大雁的例子 :

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

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

有此可见:

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

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

聚合关系图:

组合关系图:

在代码中表现如下:

这两种关系的区别是:

1.构造函数不同

  • 聚合类的构造函数中包含另一个类的实例作为参数

因为构造函数中传递另一个类的实例,因此大雁类可以脱离雁群类独立存在。

  • 组合类的构造函数包含另一个类的实例化

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

2.信息的封装性不同

在聚合关系中,客户端可以同时了解GooseGroup类和Goose类,因为他们是独立的。

在组合关系中,客户端只认识大雁类,根本不知道翅膀类的存在,因为翅膀类被严密地封装在大雁类中。

5.泛化(Generalization)

泛化是学术名称,通俗的来讲,通常包含类与类之间的继承关系和类与接口实现关系。

类与类之间的泛化

接口的实现

题外话:这种东西不可纸上谈兵,需要多多实践,实践-认识-再实践-再认识,不断地批评与自我批评。


理解这个就能看懂各种:设计模式(的UML描述),并且构建相应的C#代码!

欢迎批评指正,Wish it helps.

浅谈UML中类之间的五种关系及其在代码中的表现形式的更多相关文章

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

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

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

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

  3. UML中类图的四种关系及其代码实现

    在uml图中 最复杂的也就是泛化,实现.依赖,关联.这四种关系了,假设弄清了这几种关系那么在理解UML图的时候就会变得轻车熟路了! 假设你对着几种关系一点都不熟悉的话能够看一下uml中的四种关系.这篇 ...

  4. 【转】浅谈UML的概念和模型之UML九种图

    原文地址:浅谈UML的概念和模型之UML九种图 目录: UML的视图 UML的九种图 UML中类间的关系 上文我们介绍了,UML的视图,在每一种视图中都包含一个或多种图.本文我们重点讲解UML每种图的 ...

  5. 浅谈UML——九种图(一)

    前言 学UML将近两个星期了,对UML有了一定的了解,学过的没学过的都知道UML中最最最核心的部分要数那九个图了.浅谈UML九种图. 实例 1.用例图: 什么是用例?描绘一个系统外在可见的需求情况,是 ...

  6. 【转】UML中类与类之间的5种关系表示

    一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一 ...

  7. uml图的五种关系 标签: uml 2016-12-18 21:47 221人阅读 评论(25) 收藏

    统一建模语言 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...

  8. UML类图五种关系与代码的对应关系

    转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...

  9. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

随机推荐

  1. PreResultListener使用

    PreResultListener是一个监听器接口,可以在Action处理完之后,系统转入实际视图前被回调. Struts2应用可以给Action.拦截器添加PreResultListener监听器, ...

  2. 帝国cms 灵动标签【列表页】调用当前父栏目下的所有子栏目

    <? $bclassid = $class_r[$GLOBALS[navclassid]][bclassid]; //获取当前父栏目ID ?> [e:loop={"select ...

  3. Model Thinking1

    Why Model Reason # 1: Intelligent Citizen of the World Reason # 2: Clearer Thinker Reason # 3: Under ...

  4. (C语言)char类型与int类型相加

    #include <stdio.h> int main(void) { ; ; int c = a + b; a += b; printf("c=%d",c); //p ...

  5. java子类实例初始化过程

    子类的实例化主要分为两个步骤: <1>.类相关静态内容 初始化: *先父类再子类:  1.父类的static属性:   2.父类的static块:   3.子类的static属性:   4 ...

  6. http server v0.1_http_webapp.c

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...

  7. Ubuntu下su:authentication failure的解决办法

    $ su - rootPassword: su: Authentication failureSorry. 这时候输入 $ sudo passwd rootEnter new UNIX passwor ...

  8. 大型系统OA--技术

    OA办公自动化系统--技术 1.由于涉及企业的流程控制与规则管理.所以系统对于规范要求的严谨性,导致在小型开发组在进行开发时必须基于成熟的技术架构.开源的lemon OA,采用了如下技术细节: mys ...

  9. apache 服务发布多个项目,只需要更改配置文件(需要设定虚拟主机)

    http://www.php186.com/content/article/apache/24609.html http://blog.sina.com.cn/s/blog_6b689d5901013 ...

  10. Unity Flow distort of screen

    Shader "ScreenWater" {Properties { _MainTex ("Base (RGB)", 2D) = "white&quo ...