一、类的基本概念和图形表示

类是对一组具有相同属性、操作、关系和语义的对象的描述。如下所示,把类画成一个矩形:
uml diagram

  • 第一行是类名。每个类名都是唯一的,并且通常首字母大写。如果一个类在一个包中,那么类名前可以加上包名,这样的类名叫做限定名;单独的类名叫做简单名。如下图所示:
    UML简明教程,UML-classUML简明教程,UML-class
  • 第二行是属性。属性描述了类的实例可以取值的范围,属性名可以使用小驼峰命名法进行命名。
    一般情况下,只简单写下属性名就可以传达类的意图了;但是,如果要对类进行详细描述,可以使用属性的完整语法形式:[可见性]属性名[': ' 类型]['[ ' 多重性 ' ]']['= ' 初始值][特性串{', '特性串}]。下图是完整的属性表示:
    UML简明教程,UML-class
  • 第三行是方法。操作描述了类的对象可以产生的行为,方法是操作的具体实现;方法名也可以使用小驼峰命名法[^first]命名。和属性一样,一般情况下简写方法名就可以说明类的操作了,但如果对详细程度有要求,可以使用操作的完整语法形式:[可见性]操作名['('参数表')'][': '返回类型][特性串{', '特性串'}],其中参数是可选的,语法形式:[方向]参数名: 类型[=默认值]。下图是完整的操作表示:
    UML简明教程,UML-class
  • 第四行是职责。职责就是类的责任,类可以有任何数目的职责。在这一行可以通过一些简短的文字分条描述类的职责。下图是类的职责示意图:
    UML简明教程,UML-class
    以上就是类元素的图形表示,可以看到,类有时候可以简化表示,也可以比较详细的表示,这取决于表达的需要。

二、类目的高级特征

在面向对象的系统中,类是最重要的构造块,但从抽象角度来看,类是类目的子概念。

一般来说,有实例的建模元素被称之为类目。比方说,类是一种类目,它的实例是对象。

另外,类目提供了行为特征和结构特征。比方说,类的属性描述了结构特征,类的操作描述了行为特征。

除了最重要的类以外,类目还包含其他的元素:接口、数据类型、信号、组件、节点、用例和子系统。

第一节我们提到了类中的可见性,特性等,他们其实是类目(尤其是类)的高级特征,除此之外还有一些其他高级特征。他们分别是:可见性,范围,抽象与多态,多重性。

可见性

对类目的结构特征和行为特征进行详细描述,说明了它能否对其他类目可见。可见性总共有四级:

  • 公用的(public)。说明结构特征和行为特征对任何外部类目都可见,用 + 号作为前缀表示。以类为例,图示如下(本文中所使用的uml画图工具是 PlantUML,注意区分例图中的可见性图标与可见性的符号前缀):
    UML-class
  • 受保护的(protected)。说明结构特征和行为特征对类目的子孙可见,用 # 号作为前缀表示。以类为例,图示如下:
    UML简明教程,UML-class
  • 私有的(private)。说明结构特征和行为特征仅对类目本身可见,用 - 号作为前缀表示。以类为例,图示如下:
    UML简明教程,UML-class
  • 包(package)。说明结构特征和行为特征对包中的类目都可见,用 ~ 号作为前缀表示。以类为例,图示如下:
    UML简明教程,UML-class

范围

范围说明了类目的结构特征和行为特征对于类目的每个实例是具有自己独有的特征值,还是共享一个特征值。

  • 实例范围(instance),对于每一个特征,每个实例都有自己的独特值。在图示方面,不做任何修饰。
  • 静态范围(static),对于每一个特征,每个实例都共享一个值,所以也叫类范围(class scope)。在图示方面,通过对特性串加下划线来表示。
    以下是以类为例的范围图示:
    UML简明教程,UML-class

抽象与多态

在类的层次结构中,存在着具体与抽象的关系。有些类是抽象类,这种类没有任何直接的实例;有些类是叶子类,这种类没有任何子类。

类的这种泛化关系也存在于类的操作上,有些操作是抽象的,其具体实现要在子类中提供,有些操作是叶子的,它不能被子类的操作覆盖。

由上得知,类的操作具有层次性,子类的操作通常能够覆盖父类的操作,这意味着在运行时,会按照对象的类型来决定匹配的操作,这被称之为多态。显而易见,叶子操作不是多态的。

在 UML 的图示上,抽象会用斜体表示,而叶子会通过 leaf 特性表明。以下是图例:
UML简明教程,UML-class

多重性

类可能拥有的实例数目称为多重性,在 UML 中,可以通过在类图标的右上角写一个多重性表达式来指明类的多重性。

类的属性也具备的多重性,表明属性的取值范围,可以通过在属性名后面的方括号内写一个表达式来指定属性的多重性。

以下是多重性的图例:
UML简明教程,UML-class

属性的其他高级特征

如上所述,属性除了可见性、范围、多重性以外,还有类型、初始值和可变性,完整语法可以参照第一节

操作的其他高级特征

除了上面提到的可见性、范围、叶子和抽象以外,操作还有一些其他特征(操作的完整语法参照第一节):

  • 查询(query),操作是一个完全没有副作用的纯函数。
  • 顺序(sequential),调用者必须在对象外部协调,以保证在对象中一次仅有一个流。在出现多控制流的情况下,不能保证对象的语义和完整性。
  • 守护(guard),通过将所有对象监护操作的所有调用顺序化,来保证出现多控制流的情况下对象的语义和完整性。其效果是一次只能调用对象的一个操作,这又回到了顺序的语义。
  • 并发(concurrent),通过把操作原子化,来保证在出现多控制流的情况下对象的语义和完整性。来自并发控制流的多个调用可以同时作用于一个对象的任何一个并发操作,而所有操作都能以正确的语义进行并发。并发操作必须设计成:在对同一个对象同时进行顺序的或监护的操作的情况下,它们仍能正确运行。 并发特性(顺序,守护,并发)表达了操作的并发语义,是一些仅与主动对象、进程或线程的存在有关的特性。
用户头像
登录后发表评论