UNL

希望有一种语言,可以直接提供有针对性的、分离的结构与行为描述手段,而且可以将描述元素整合起来。

面向对象中的诸多基本概念,例如封装,继承,多态,都可以使用 UML 表示。UML 与面向对象软件开发方法有着十分紧密的联系,它的诞生也是融合了众多其他面向对象图形建模技术的结果。

UML 具有极强的表达能力,为系统中不同场景及粒度下的建模提供了相应的图表语言。 UML 图表大致可以分为结构性图标和行为性图表。

提供一种面向对象式的抽象又直观的描述逻辑

  • 抽象:把系统抽象表示为类和类之间的协同
  • 直观:通过可视化的模型图来描述和展示系统功能、结构和行为

类图

类图的主要作用是用来显示系统中的类、接口以及它们之间的静态结构和关系。

类图

类和接口

类图中的基本元素当然是接口,其中类里有类名,属性,方法三种元素,与类相类似,接口也有接口名,方法两种元素。

图片

泛化和实现

描述类与类,类与接口,接口与接口之间两种**“纵向关系”**的是:

  • 泛化(Generalization),使用空心三角形+实线表示
  • 实现(Realization),使用空心三角形+虚线表示
图片

依赖、关联、聚合、组合

类与类之间还包括四种“横向关系”:

  • 依赖(Dependency):果对象A用到对象B

    • B的实例为A的构造函数或方法中局部变量
    • A调用了B的静态方法
    • B的实例为A的方法中的参数
    • B的实例为A方法中的返回值
  • 关联(Association):对象和对象之间的连接,它使一个对象知道另一个对象的属性和方法。

    • 关联的本质是一个类需要另一个类来管理数据或者请求服务。

    • 关联关系有单向关联双向关联,大多数关联都是单向关联,单向关联关系更容易建立和维护,有助于寻找可重用的类

      • 双向关联:两个对象都知道(即可以调用)对方的公共属性和操作
      • 单向关联:只有一个对象知道(即可以调用)另一个对象的公共属性和操作
    • 关联关系的代码表现形式为一个对象含有另一个对象的引用

      1
      2
      3
      4
      5
      6
      7
      8
      9
      // A B双向关联
      public class A {
      private B attr1;
      private B attr2;
      }

      public class B {
      private A attr1;
      }
    • 关联关系用带双箭头的实线或者无箭头的实线表示,单向关联用实线箭头表示

    • 关联

  • 聚合(Aggregation),是关联关系的一种特例。

    • 此时整体与部分之间是可分离的,它们可以具有各自的生命周期。整体对象可以包含部分对象,但部分对象的生命周期不依赖于整体对象
    • 在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
    • 聚合关系用空心菱形箭头表示,其中菱形箭头的一方表示整体
    • 聚合
  • 组合(Composition),是关联关系的一种特例。

    • 此时整体与部分是不可分的,部分也不能给其它整体共享,作为整体的对象负责部分的对象的生命周期
    • 如果A组合B,则A需要知道B的生存周期,即可能A负责生成或者释放B,或者A通过某种途径知道B的生成和释放。
    • 组合

状态图

它是一种行为图,用于描述对象的状态和状态之间的转换。这里的对象大多数情况是指的类生成的对象,但是有时候也会代表对象、参与者、用例、子系统等。

起始状态

状态机的起始状态黑色实心圆点表示,起始状态只能有出度,不能有入度。

起始状态

中间状态

状态机的中间状态,用圆角矩形表示。

中间状态

结束状态

状态机的结束状态,用带外圆的黑色实心圆点表示。

结束状态

状态转移

状态机的状态转换,在转换前状态指向转换后状态的黑实线上表示。

状态转移

只有当响应事件发生的时候才有可能进行状态转换。事件标记是转移的诱因,可以是一个信号,事件、条件变化(a change in some condition)和时间表达式。

生命一个实际的状态转换事件,通常由四个部分组成:

  1. 名称:如这里的 Open ,方便我们识别这里的动作是什么
  2. 事件标记:如这里的open(key),表示状态转移的发生条件,并不是所有的事件都能在任何状态转移
  3. 守护条件:如这里的key.id==locker.getId()表示判定是否状态转移发生的条件,显然当钥匙和门不对应的时候不能开锁;
  4. 结果:如这里的locker.unlock(key) ,只有当事件标记发生且守护条件成立的情况下才能执行后续的结果操作。

顺序图

它是是一种行为图,展示了对象之间的消息传递顺序,以及消息传递的时序关系。

生命线

顺序图中的生命线,表示对象的生存时间,用矩形下连虚线表示:

生命线

name 的命名方法有以下几条规则:\[对象名][:类名]

  1. 对象名
  2. 类名:对象名
  3. 类名

当使用下划线时,意味着顺序图中的生命线代表一个类的特定实体。每个生命线都关系到一个实体。

消息

顺序图中的消息,用黑实线和箭头表示:

对象之间的交互是通过相互发消息来实现的。一个对象可以请求 (要求)另一个对象做某件事件。消息从源对象指向目标对象。消息一旦发送便从源对象转移到目标对象。

消息也分主要分成六类:

消息种类 消息意义 图例
同步消息 消息的发送者把进程控制传递给消息的接收者,然后暂停活动,等待消息接收者的回应消息。 图片
异步消息 消息的发送者将消息发送给消息的接受者后,不用等待回应的消息,即可开始另一个活动。 图片
返回消息 返回消息和同步消息结合使用,因为异步消息不进行等待,所以不需要知道返回值。 图片
创建消息:注明<<create>> 创建消息用来创建一个实例,可以测试出,若指向一个声明线的中部,StarUML 会自动将目标生命线 移动到创建消息的地方开始,其上方不存在。 图片
**摧毁消息:**注明<<destory>> 摧毁消息用来摧毁一个实例,生命线上会出现一个 X 表示结束。 图片
Lost and Found Message 这类消息的特点是它可能没有发送者或者接收者 图片