类是一种对本质相同事物的抽象,人类软件开发技术的发展历史,就是还事物以本源的历史,开发技术、名词越来越接近世界的真实,“面向对象”、“类”就是这样的产物。

  1类图

  在UML中,类图显示了一组类、接口、协作以及它们之间的关系。在UML的静态机制中类图是一个重点,它不但为设计人员所关心,更为实现人员所关注,建模工具也主要依据类图来产生代码(正向)工程。因此,类图在UML的各种图中占据了相当重要的地位。

  

在类图中类用矩形框来表示,它的属性和操作分别列在分格中,若不需要表达详细信息时,分格可以省略。一个类可能出现在好几个图中。同一个类的属性和操作只在一种图中列出,在其他图中可省略。图1给出Student类。

图1类的表示

  类间关系

  在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。

  (1)继承:指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。类图中继承的表示方法是从子类拉出一条闭合的、单键头(或三角形)的实线指向基类。例如,图2给出了students类和学校中某团社成员a_member的继承关系。


图2 类的继承

  类的继承在C++中呈现为:

  class B { }
  class A : public B{ }

  (2)关联:指的是模型元素之间的一种语义联系,是类之间的一种很弱的联系。关联可以有方向,可以是单向关联,也可以是双向关联。可以给关联加上关联名来描述关联的作用。关联两端的类也可以以某种角色参与关联,角色可以具有多重性,表示可以有多少个对象参与关联。可以通过关联类进一步描述关联的属性、操作以及其他信息。关联类通过一条虚线与关联连接。对于关联可以加上一些约束,以加强关联的含义。
 
  关联在C++中呈现为:

  class A{...}
  class B{ ...}
  A::Function1(B &b) //或A::Function1(B b) //或A::Function1(B *b)

  即一个类作为另一个类方法的参数。

  (3)聚合:指的是整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构。从而找出一些组成类,该整体类和组成类之间就形成了聚合关系。例如一个汽车包括轮胎和发动机等。需求描述中“包含”、“组成”、“分为…部分”等词常意味着聚合关系。


图3 类的聚合

  (4)组合:也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。

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

  我们用浅显的例子来说明聚合和组合的区别。“国破家亡”,国灭了,家自然也没有了,“国”和“家”显然也是组合关系。而相反的,计算机和它的外设之间就是聚合关系,因为它们之间的关系相对松散,计算机没了,外设还可以独立存在,还可以接在别的计算机上。在聚合关系中,部分可以独立于聚合而存在,部分的所有权也可以由几个聚合来共享,比如打印机就可以在办公室内被广大同事共用。

  在C++语言中,从实现的角度讲,聚合可以表示为:

  class A {...}
  class B { A* a; .....}

  即类B包含类A的指针;

  而组合可表示为:

  class A{...}
  class B{ A a; ...}

  即类B包含类A的对象。

  准确的UML类图中用空心和实心菱形对聚合和组合进行了区分。

图4组合


图5 银行管理系统类图

  图3.5给出了一个银行管理系统的类图,基本上一看就懂:

  银行类聚合了账号库(AccountSet)、客户库(CustomerSet)和员工库(EmployeeSet);

  账号库中包含了n个账号(account)、客户库中包含了n个客户(customer),员工库包含了n个员工(employee);

  员工类和客户类都继承自人(person)类,而员工类中又有一种特殊的员工,即员工管理者类(employeeAdmin);

  账号类和客户类之间体现出一种关联关系;

  接下来,我们给出建立类图的步骤:

  (1)研究分析问题领域确定系统需求;

  类的识别是一个需要大量技巧的工作,寻找类的一些技巧包括:名词识别法;根据用例描述确定类;使用CRC分析法;根据边界类、控制类、实体类的划分来帮助分析系统中的类;参考设计模式确定类;对领域进行分析或利用已有领域分析结果得到类;利用RUP中如何在分析和设计中寻找类的步骤。

  (2)确定类,明确类的含义和职责、确定属性和操作;

  (3)确定类之间的关系。

  2对象图

  对象图显示某时刻对象和对象之间的关系,是类图的变化,一个对象图可看成一个类图的示例(example),对象图表示的是类的对象实例而不是真实的类。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。

  对象图中并无新的表示法(除了对象名下要加下划线以外),与类图中的表示法一样,可以认为,只有对象而无类的类图就是一个“对象图”。


图6 对象图

  在对象图中,对象名可以有三种表示形式:

  (1)对象名:类名

  (2):类名

  (3)对象名

  图6中的是第1种,即“对象名:类名”格式。

  实质上,对象图几乎很少被用到(它包含的信息量太小,仅仅用于呈现某一时刻对象的值,对软件的设计几乎没有太大的帮助),使用远没有类图广泛。我们可以这样类比类图和对象图之间的关系:

  “动词+名词”构成“动名词”,例如动词“爱”+名词“国”构成动名词“爱国”。

  我们可以看到,“动名词”的信息量很大,很抽象,而作为动名词的例子的“爱国”信息量很小,具体程度很高。

  动名词 ―――――> 类图

  爱国  ―――――> 对象图

  把“动名词”看作类图,把“爱国”看作对象图,很明显,对象图就是类图的一个example而已。

转载于:https://www.cnblogs.com/Jackey_Chen/archive/2008/10/14/1310734.html

UML轻松入门--类和对象相关推荐

  1. 统一建模语言UML轻松入门(3)――静态建模:类和对象

    统一建模语言UML轻松入门(3)――静态建模:类和对象 --------------------------------------------------------------------- 宋宝 ...

  2. 统一建模语言UML轻松入门系列

    第五讲:统一建模语言UML轻松入门之综合实例 第四讲:统一建模语言UML轻松入门之动态建模 第三讲:统一建模语言UML轻松入门之静态建模:类和对象 第二讲:统一建模语言UML轻松入门之静态建模:用例 ...

  3. 统一建模语言UML轻松入门(1)――基本概念

    统一建模语言UML轻松入门(1)――基本概念 --------------------------------------------------------------------- 宋宝华 ema ...

  4. ES6快速入门——类与对象

    ES6快速入门--类与对象 1. 类 1.1 定义类 1.2 构造函数 1.3 属性与方法 1.3.1 属性 1.3.1 方法 1.4 继承 1.5 重写 1.6 super 2. 对象 2.1 创建 ...

  5. 统一建模语言UML轻松入门之用例

    目前,在的内地版<神雕侠侣>中,杨过和小龙女有一份不为人知的默契与浪漫,那就是他们所绘制的并肩小人图.这样的小人图,是UML用例图的一部分,被称为参与者. 2.1 用例与用例图 用例是需求 ...

  6. 学习笔记(01):8小时Python零基础轻松入门-类

    立即学习:https://edu.csdn.net/course/play/29122/408297?utm_source=blogtoedu 类(class)是一种面向对象计算机编程语言的构造,是创 ...

  7. 【Python基础入门系列】第10天:Python 类与对象

    首先,我已经假定你是个萌新或已经看了无数遍的垃圾文章,然后依然搞不懂类和对象,但是呢起码知道有类和对象这么两个玩意儿,我觉得有必要找一篇生动形象的示例来讲解. 由于你可能没有编程经验, 所以无法从学过 ...

  8. Java快速入门学习笔记7 | Java语言中的类与对象

    有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...

  9. 在 UML 静态结构图中使用类和对象

    在 UML 静态结构图中使用类和对象 向类.组件或其他元素添加接口 在静态结构图.组件图或部署图中,将棒糖形"接口"形状(用一条直线加圆圈表示)拖到绘图页上. 将不带圆圈的端点粘附 ...

最新文章

  1. 中国AI创新者论坛将于3月21日在清华大学举办
  2. php分页样式,thinkphp分页样式修改
  3. linux 关闭打开的文件描述符,关闭它们后重新打开stdout和stdin文件描述符
  4. 在.Net中进行跨线程的控件操作(上篇:Control.Invoke)
  5. c语言拟合线性直线误差最小,急~~~~~~!!!求解!用C语言编写最小二乘法求数据的拟合曲线~并做出图显示拟合效果!高分悬赏!...
  6. mysql.zip免安装版配置
  7. c语言设置bufsiz大小,c语言缓冲区有关问题及c++中的this指针
  8. RTSP协议播放网络视频
  9. MOM SMS SharePoint
  10. 谈谈物联网产业4G转型中的隐忧与应对
  11. 出版了两本实体书,写了9本开源电子书,还上了百度百科,冰河这是要起飞了吗?(建议收藏)
  12. android修改机型cpu,mac,androidid....
  13. 稳定kms服务器,kms服务器
  14. springboot项目启动参数详解
  15. 路由器的两个端口接在同一个交换机上_交换机到底有什么用啊?
  16. 程序员戴耳机是为了撩妹子?感觉好酷的样子~
  17. 冉宝的每日一题-8月16日回溯法+ 动态规划压缩
  18. vue的props父向子传值
  19. P02014158 马帅(信息论课程作业)
  20. 三次bezier曲线 MATLAB,Matlab-画二次及三次Bezier曲线-8控制点的B样条曲线

热门文章

  1. PHP面试题:windows平台, Apache Http Server启动失败, 排错思路是什么?
  2. PHP面试题:合并两个数组有几种方式,试比较它们的异同
  3. Toad for Oracle工具的使用(二)
  4. InstantClient安装使用
  5. python做基本的图像处理
  6. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器...
  7. 基于tomcat集群做session共享
  8. python基础(二)字符串內建函数详解
  9. C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
  10. [转载]ios简单sqlite使用