[面向对象程序设计]第二章: 类图以及类之间的关联关系

如何绘制类图

一个框图编辑器的例子

在这里插入图片描述

  • 编辑的框图使用Diagram表示, 框图中可以绘制许多矩形, 使用Rectangle表示, 绘制矩形时需要选择工具, 使用RectangleTool表示
  • 给定一个Diagram, 用户可以选择一个Rectangle(1), 也可以选择其余绘图工具(0)
  • 给定一个RectangleTool, 它一定属于一个Diagram
  • 给定一个Diagram, 里面可以有任意个矩形
  • 给定一个Rectangle, 它一定属于一个Diagram
    在这里插入图片描述
  • 使用Diagram Editor 表示框图编辑器本身
  • 给定一个Diagram Editor, 可以创建多个Diagram
  • 给定一个Diagram , 它一定属于一个Diagram Editor
    • 上面一条线表示两个类的包含关系
    • 下面一条线是current关系
      • 对应一个Diagram Editor, 当前活动的Diagram只有一个
      • 对于一个Diagram, 如果它是活动的, 它属于一个Diagram Editor, 如果它不是当前活动的, 它不属于一个Diagram Editor

在这里插入图片描述

  • 这三个图形类有一些共同的属性和操作, 应该将他们抽象出一个基类
    在这里插入图片描述

在这里插入图片描述

  • 类名斜体显示 : 抽象类, 从这个类并不会派生出实际的对象, 只是为了定义某个接口. 一定会有某些类继承该类派生出对象

  • instantiate : 实例化关系
    在这里插入图片描述

类图的操作和属性(Operations and Attributes)

在这里插入图片描述

  • 三部分: 类名, 数据成员, 成员函数

  • 数据成员

    • 属性名 : 类型
  • 成员函数

    • 函数名(参数) : 返回值类型
  • 框图编辑器的完整类图
    在这里插入图片描述

  • Multiplicity

    • 0…9 : 表示0~9
      • : 表示任意个
    • 1 : 表示精确的一个数字
    • 0, 3…* : 0 或者 3~∞
  • class multiplicity

    • 类图的右上角
    • 一个类可以创建多少对象
    • 默认情况: 0…*
    • singleton class
      • 只创建一个对象
        在这里插入图片描述
  • 类的数据成员

    • 简单 : name
    • 一般 : name:type
    • 复杂 : name:type = default_value
    • instance scope : 每个对象独有的数据成员
    • class scope : 类的数据成员, 所有对象共有
  • 类的成员函数

    • name(参数名:参数类型): 返回值类型
      在这里插入图片描述
    • 也具有instance scope 和 class scope

类之间的关联关系

在这里插入图片描述

  • 如何表示一个人在公司中担任多个角色
    在这里插入图片描述

    • UML中对于给定的两个对象, 和类之间的关联关系, 这两个对象之间的只能存在一种关联关系
    • 解决办法 : 引入一个中间类
      在这里插入图片描述
  • Generalization : 从多个类抽象出基类

  • Specialization : 从一个类派生出其余的类

  • 一个人可以拥有多个账户, 但是只能拥有一个现金账户
    在这里插入图片描述

    • 存在的问题: Customoer类和Account类有两个关联关系
    • 解决办法 : 增加 Association Generalization
      在这里插入图片描述
    • 当有箭头时, 会去读取下面一个关联关系, 而忽略上面的关联关系

Aggregation关系

  • 用来描述包含关系, 部分/全部的关系
  • 两个性质
    • 反对称性(anti-symmetry) : 不能自身包含
    • 传递性(transitivity) : B包含A, C包含B, 则C包含A
  • 这两个性质是使用Aggregation关系的必要条件. 如果满足Aggregation关系, 必须满足这两个性质.

在这里插入图片描述

  • 一个MailMessage 可以包含 一个 Header, Body, Attachment (注意菱形的位置, 放在包含者的那一边)

  • 如果没有Aggregation关系, 那么会带来什么问题, 示例如下
    在这里插入图片描述

  • 上述普通的关联关系会造成的以下问题, 下述两种情况都是实际情况中不允许出现的. 实际中一个Assembly不能包含自身
    在这里插入图片描述

  • 更改如下. 引入Aggregation关联关系, 排除了自包含的情景.
    在这里插入图片描述

  • 如果一个关系中不能有自包含, 有包含传递性, 就可以使用Aggregation关联关系. 此时不要使用普通关联关系, 否则会出错.

  • Aggregation关联关系也不一定非要是部分/全部的包含关系, 下面这种关系也可以,
    在这里插入图片描述

  • 一个人不可以是自己的祖先或者父亲, 因此两者都满足反对称性

  • A是B的祖先, B是C的祖先, 那么A是C的祖先正确; 但是父亲关系则不对.

Composite 关系

  • 一种更强的包含关系, 在Aggregation基础上, 还需满足以下两个性质
    • 一个part只能包含于一个composite对西那个
    • 当一个composite对象析构时, 所有依赖它的部分都会同一时间析构
  • 使用实心菱形框表示 (黑色菱形框)
    在这里插入图片描述
  • 一个Header和一个Body只能属于一个MailMessage, 当MailMessage析构时, Header和Body都需要被删除
  • Attachment可以被多个MailMessage包含, 当MailMessage被删除时, Attachment不一定被删除.

在这里插入图片描述

  • 上面例子中的第一个类图无法限制程序只能和自己计算机上的端口相联, 不能和另外的计算机端口相联. 从而产生了下面的错误示例
  • 改进如下
    在这里插入图片描述
  • ConnectedTo被包含在Computer类的里面, 表示只能同一个对象的Processor和Port相联
    在这里插入图片描述
  • 上图表示不同计算机之间的Port相连, LinkedTo关联关系在外面, 不能放在Computer里面.

关联类 (Association classes)

  • 随着关联关系的产生会出现一些新的信息
    在这里插入图片描述
  • marks 是在Takes这个关联关系产生后才出现的, 并不是Student的固有属性. 不应该放在Student中. 因此引入了Association Classes
    在这里插入图片描述
  • 如下: salary属性只有在Person被雇佣时才最在.
    在这里插入图片描述
  • Association class 一旦产生后, 就和其余的类一样使用. 也可以和其余的类产生新的关联关系.

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40996518/article/details/106294283