设计模式基础:类及类关系的UML表示

2009-10-26 17:00 by 宗哥, 1891 阅读, 1 评论, 收藏, 编辑

UML中,类关系分为这几种,泛化(generalization), 实现(realization),依赖(Dependency),关联(associate),聚合(aggregation),(composition)下面分别是UML实现及C#中的代码表现。

泛化(generalization)

泛化也称作特化(specialization),用来表示一个更一般和更特殊的分类器之间的关系,从面向对象的角度来看,他表达的是类和类之间的继承(inheritance)关系。

例如:Person(人)继承了Organism(生物)类, Organism是更一般的分类器,Person是更特殊的分类器。

注意,泛化在语义上理解为更特殊的分类器 is kind of更一般的关系,本例我们可以理解人是生物的一种或者是一种生物。记住这点很重要。

实现(realization)

是指特殊化的分类器和接口之间的一种关系,从面向对象的角度来看,他表达的是分类器遵守并实现接口的契约(Contract)。

例如:奇瑞公司要生产一款轿车,由于产能原因发动起部分决定采用不同厂家的发动机,他只要规范这个发动机的一些参数可以。BmwEngine(宝马发动机)和AndiEngion(奥迪发动机)实现了Engine的契约,便可以被采用。

接口表示 I can do的一种概念,例如 BmwEngine(宝马引擎)完全可以做Engine(引擎)做的事情。

C#中 泛化(generalization)和实现(realization)的比较

我们不讨论语言层面抽象类 (abstract class) 和接口(Interface)的技术性差别。

在C#中,泛化我们主要指类和类的继承关系,表示is kind of的关系,当然如果一个接口继承了另外一个接口,我也主张把他划分为泛化,这符合is kind of的观点。实现主要指类和接口的关系,表示这个类完全实现了接口成员,I can do 。当然两者在C#实现上都是通过符合”:”实现,但是在语义上完全是两回事情,在UML关系图中识别也不一样。还要提醒你下,如果在C#中,你的类如果继承了一个类,同时实现了一或者多个接口,一定要把类写在所有接口的前面。

依赖(Dependency)

依赖关系是一种相对简单的关系,表示一个类会用到另外一个类,这个关系具有相对的偶然性。他表达的是参与关系的模型元素,并不会直接转化为程序代码(前文我们讲的泛化和实现都直接转化为程序代码了)。

例如 微软SqlHelper类和SqlConnetciont(Sql连接),可以看做SqlHelper依赖SqlConnetciont。

依赖(Dependency)关系语义上是比较弱的一种关系模型,通常在以下情况我们认为A依赖于B:

1. A中的方法中有B类型的参数

2. A方法中实例化B或者调用了B的静态方法

关联(associate)

关联我们分单项管理和双向关联。单相关联表示两个类是相关的,但是只有一个类知道这种联系的存在,双向关联两个类彼此知道它们间的联系。

双向关联的例子:FeedIn(订单)类和Order (订单)类:

类FeedIn的代码

类Order的部分代码

可以看出,Order类知道他的Feed In,FeedIn也知道他的Order。

注意其多重值的含义:

可能的多重值描述

表示

含义

0..1

0个或1个

1

只能1个

0..*

0个或多个

*

0个或多个

1..*

1个或我个

3

只能3个

0..5

0到5个

5..15

5到15个

单项关联的例子:Order Report(订单报表)类和订单(Order)类:

Order Report的部分代码

注意其箭头编号和Order中代码,可以看出,Order不知道Order Report(订单报表)的存在。

C#依赖和关联的比较

在C#中,关联的类通常体现在类的成员变量,表示一种相对固定长期的关系,而依赖关系通常体现在局部变量,表示一种相对偶然,临时的关系。

聚合(aggregation)

聚合也是一种关联,但是对于关联来讲,关联的双方没有明显的主次关系,例如 FeedIn(入库单)类和订单(Order)类,Order Report(订单报表)类和订单(Order)类等等,聚合在聚集中,则有主次之分,“主”的一方只能有一个。

例如Order(订单)和 OrderDetail(订单明细),

 Order的部分代码

Order Detail的部分代码

聚集关系和关联关系的区别还表现在以下方面:

(1) 对于具有关联关系的两个对象,多数情况下,两者有独立的生命周期。FeedIn(入库单)类和订单(Order)类,。FeedIn(入库单)的销毁不会影响订单(Order);反之亦然。

(2) 对于具有聚集关系(尤其是强聚集关系)的两个对象,整体对象会制约它的组成对象的生命周期。部分类的对象不能单独存在,它的生命周期依赖于整体类的对象的生命周期,当整体消失,部分也就随之消失。例如Order(订单)和 OrderDetail(订单明细),不过,有的设计者也允许单独的OrderDetail存在,这有点类似我们说的“数据岛”之类的问题。

不过,在C#中表示关联关系和聚集关系时,两者比较相似,都是作为成员变量存在。

组合(composition)

关联(associate)关系在设计中一般体现为聚合(aggregation)和组合(composition)关系,组合和聚合相似,但表示一种更强烈的组合语义关系:

例如Person(人)和 Head(头),

Person(头)类的部分代码

Head(头)类的部分代码

UML图及关系总结:

泛化(继承):表示一般与特殊的关系,用一条实线加空心箭头来表示;

实现:表示类与接口的关系,用一条虚线加空心箭头来表示;
关联:连接模型元素及链接实例,用一条实线来表示;

依赖:表示一个元素以某种方式依赖于另一个元素,用一条虚线加箭头来表示;

聚集:表示整体与部分的关系,用一条实线加空心菱形来表示;

组成:表示整体与部分的有一关系,用一条实线加实心菱形来表示;

设计模式基础:类及类关系的UML表示的更多相关文章

  1. java 类与类之间的关系 及uml图

    类与接口之间的关系 : 继承 类与类之间的关系 :继承关系  包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(associ ...

  2. 【设计模式】UML类图及Java的类之间的关系

    UML类图展示 设计模式中的对象关系 关联和依赖的对比 依赖关系 虚线箭头 依赖是a类成员方法中有b类的属性,动物新陈代谢方法中有水和空气的属性,只有调这个方法的时候,才可能临时用一下 关联关系 实线 ...

  3. Python设计模式 - 基础 - 类/接口之间的六种关系

    在程序中需要把世间万物抽象成相应的类,现实世界中物与物之间的关系和程序中类与类之间的关系相对应,因为世间万物是普遍联系的,所以程序中类与类之间也不是孤立的.在系统分析和框架设计中,根据面向对象机制的三 ...

  4. 设计模式之UML类图六大关系辨析【2】

    六大关系:继承(extends).实现(Realization).依赖(use-a).关联(association).聚合(has-a).组合(强聚合)(Composition). 类与类之间的强弱关 ...

  5. UML基础系列:类图

    类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...

  6. 初识UML类图--类之间关系

    前言 最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这 ...

  7. 图解UML类与类之间的六中关系

    大话设计模式上的一个图,我用EA画出来的:  UML中的6大关系相关英文及音标:  依赖关系 dependency [di'pendənsi]  关联关系 association  [ə,səuʃi' ...

  8. UML类图与类间六种关系表示

    UML类图与类间六种关系表示 1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的 ...

  9. 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml

    一.RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be deter ...

随机推荐

  1. 02_NoSQL数据库之Redis数据库:string类型和hash类型

     Strings类型及操作 String是最简单的类型,一个key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或者序列化的对象. S ...

  2. Troubleshooting Autoinvoice Import

    metalink :1089172.1 In this Document   Purpose   Troubleshooting Steps   AutoInvoice Execution Repor ...

  3. iOS中 UITabBarController中自定义UITabBar

    1.创建多个视图控制器,放如UITabBarController中 AViewController *aa = [[AViewController alloc] init]; UINavigation ...

  4. CentOS配置

    1.在Vmware中安装好虚拟机. 2.客户机(即虚拟机中的centos)网络连接使用仅主机模式Host-only 3.在主机中网络配置上,配置IP地址 1.使用PieTTY远程连接该虚拟机 2.使用 ...

  5. 04-GIT TortoiseGit冲突和补丁演示 案例演示

    TortoiseGit安装下载 http://download.tortoisegit.org/tgit/1.8.12.0/ 或https://code.google.com/p/tortoisegi ...

  6. android sensor架构

    Android Sensor 架构深入剖析 作者:倪键树,华清远见嵌入式学院讲师. 1.Android sensor架构 Android4.0系统内置对传感器的支持达13种,它们分别是:加速度传感器 ...

  7. ROS(indigo)机器人操作系统学习有趣丰富的Gazebo仿真示例evarobot

    一直在寻找一个示例可以将ROS学习中常用的基础内容大部分都包含进去,最好还包括Gazebo仿真, 这样即使没有硬件设备,也可以很好的学习ROS相关内容,但又必须有对应的硬件,便于后续研究. 这里,介绍 ...

  8. 开始ITGEGE教育社区的视频录制----嵌入式基础知识讲解

    从8月份开始,陆陆续续要对我的第一份兼职工作ITGEGE讲师做教学视频录制了,本人水平有限,我只讲一些开发在工作中的应用,其它细节的东西不做深究,毕竟本人工作经验和精力也有限,白天要上班,特别是最近又 ...

  9. 跨平台移动APP开发进阶(二)HTML5+、mui开发移动app教程

    前端开发APP,从HBuilder开始~ 序 通过 HTML5 开发移动App 时,会发现HTML5 很多能力不具备.为弥补HTML5 能力的不足,在W3C 中国的指导下成立了www.HTML5Plu ...

  10. C++中const的实现机制深入分析

    via:http://www.jb51.net/article/32336.htm C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢?本文将对这两个问题进行一些分析,需 ...