目录
1、类目
2、高级类
3、可见性
4、实例范围和静态范围
5、抽象元素、叶子元素和多态性元素
6、多重性
7、属性
8、操作
9、模板类
10、标准元素
1、类目
类目 (classifier)是描述结构特征和行为特征的机制。类目包括类、关联、接口、数据类型、信号、构件、结点、用况和子系统
2、高级类
在类的属性和操作基础上,允许按任何所希望的详细程度对类进行可视化、详述、构造和文档化,甚至足以支持模型和代码的正向工程和逆向工程。
3、可见性
对类目的属性和操作进行详述的设计细节之一是它的可见性。特征的可见性描述了它能否为
其他类目使用。在UML中,可以描述四级可见性中的任一级。
(1)公用的(public)【+】。任何对给定的类目可见的外部类目都可以使用这个特征
【一个类目可以看到在同一个范围内并且具有显式或隐式关系的其他类目】
(2)受保护的(protected)【#】。类目的任何子孙都可以使用这个特征
(3)私有的(private)【-】。只有类目本身能够使用这个特征
(4)包(package)【~】。只有在同一包中声明的类目能够使用这一特征
下图显示了一个类Toolbar的公用的、受保护的和私有的特征。
当指定类目特征的可见性时,一般要隐藏它的所有实现细节,只显露对于实现该抽象的职责
必要的特征。这正是信息隐藏的基础,对于建造坚固而有弹性的系统是很重要的。如果没有
显式地用可见性符号修饰一个特征,通常就假设这个特征是公用的。
4、实例范围和静态范围
对类目的属性和操作进行详述的另一个重要的细节是范围。特征的范围指出是否类目的每一
个实例都具有自己独特的特征值,还是类目的所有实例都共同拥有单独一个特征值。在UML
中,可以说明两种范围。
(1)实例(instance)。对于一个特征,类目的每个实例均有它自己的值。这是默认的,
不需要附加的符号。
(2)静态的(static)。对于类目的所有实例,特征的值是唯一的。也把它称为类范围
(class scope),通过对特性串加下划线来表示它。
静态范围的特征大多用于私有属性,它们必须为一个类的所有实例所共有,例如,为一个类的新实例生成的唯一ID。
5、抽象元素、叶子元素和多态性元素
泛化关系用于对类的网格结构建模,其中有位于顶层的较为一般的抽象和位于底层的较为特
殊的抽象。在这些层次中,经常要指明一些类是抽象的,这意味着这些类没有任何直接的实
例。在 UML 中,通过把一个类的名称写为斜体来指明这个类是抽象的。如图所示,Icon
、Rectangular和ArbitraryIcon都是抽象类。相反地,具体类(如类Button和类OKButton)是可以有直接实例的类。
当运行中要发送消息时,在这个层次中调用的操作就被多态地选择,即在运行时按照对象的类型决定匹配的操作。
例如,display和isInside是两个多态操作。
操作Icon::display()是抽象的,这意味着它是不完全的,要求子类提供这个操作的实现。在UML中,如同指明抽象类一样,通过把操作的名称写为斜体来指明这个操作是抽象的。
Icon::getID()是叶子操作,因此被指派了特性leaf,这意味着该操作不是多态的,不可以被覆写(这类似于java中的final操作)。
6、多重性
当使用类时,假设一个类具有任意数目的实例是合理的(当然,除非它是一个抽象类,因而
没有直接的实例,但它的具体的子类可以有任意数目的实例)。然而,有时可能要限制类所
具有的实例数目。
最常见的是指定以下几种情况:
没有实例(在这样的情况下,这个类是一个只暴露静态范围的属性和操作的实用程序的类)、
有一个实例(单体类)、有一定数目的实例或有多个实例(默认情况)。
多重性也应用于属性。可以通过在属性名后面的方括号内写一个合适的表达式来指定属性的
多重性。例如,图中,在类NetworkController的实例中有两个或多个consolePort实例。
7、属性
在大多数抽象层次上,当对类的结构特征(即属性)建模时,只需简单地写下每个属性的名
称。这些信息通常足以使一般读者理解模型的意图。如前面部分所述,也可以详述各个属性
的可见性、范围和多重性。更多地,还可以详述各属性的类型、初始值和可变性。
在UML中,属性的完整语法形式为:
[可见性] 属性名 [ ' : ' 类型] [ ' [ ' 多重性 ' ] ' ] [ ' = ' 初始值] [特性串{ ',' 特性串}]
origin 只有属性名
+ origin 可见性和属性名
origin : Point 属性名和类型
name : String[0..1] 属性名、类型和多重性
origin : Point = (0,0) 属性名、类型和初始值
id : Integer { readonly } 属性名、类型和特性
除非另行指定,否则属性总是可变化的(changeable)。可以用readonly特性指明在对象
初始化后不能改变属性的值。
在对常量建模或对创建实例时初始化后不能变化的属性建模时,主要使用readonly属性。
8、操作
在大多数抽象层次上,当对类的行为特征(即类的操作和类的信号)建模时,只需简单地写
下每个操作的名称。这些信息通常足以使一般读者理解模型的意图。然而,如前所述,也可
以详述各操作的可见性和范围。更多地,还可以详述各操作的参数、返回类型、并发语义和
其他特性。总体上,操作的名称加上它的参数(如果有的话,也包括返回类型)被称为操作
的特征标记。
类的每一个非抽象操作必须有一个方法,这个方法的主体是可执行
在UML中,操作的完整语法形式为:
[可见性] 操作名 [ '( ' 参数表 ' ) ' ] [ ' : ' 返回类型] [特性串 { ' ,' 特性串}]
例如,下列操作声明都是合法的。
display 操作名
+ display 可见性和操作名
set (n : Name,s : String)操作名和参数
getID ( ) : Integer 操作名和返回类型
restart ( ) {gaurded} 操作名和特性
在操作的特征标记中,可以不提供参数,也可以提供多个参数,其语法形式如下:
[方向] 参数名 : 类型 [=默认值]
方向可以取下述值之一。
in 输入参数,不能对它进行修改。
out 输出参数,为了向调用者传送信息可以对它进行修改。
inout 输入参数,为了向调用者传送信息可以对它进行修改。
9、模板类
模板是一个被参数化的元素。在诸如 C++和 Ada 这样的语言中,可以写模板类,每一个模板
类都定义一个类的家族(也可以写模板函数,每一个模板函数都定义一个函数的家族)。模
板可以包括类、对象和值的插槽,这些插槽起到模板参数的作用。不能直接使用模板,必须
首先对它进行实例化。实例化是要把这些形式模板参数绑定成实际参数。对一个模板类来说
,绑定后的结果就是一个具体类,能够像普通类一样使用
template<class Item,class VType,int Buckets>
class Map {
public:
virtual map(const Item&,const VType&);
virtual Boolean isMappen(const Item&) const;
...
};
然后可以对这个模板进行实例化,以便把对象Customer映射到对象Order。
m : Map<Customer,Order,3>;
在UML中也能对模板类建模。如上图所示,模板类的画法与普通类一样,只是在类图标的右
上角带有一个附加的虚框,虚框中列出模板参数。
如上图所示,可以用两种方法对模板类的实例化进行建模。
第一种方法是隐式的,即声明一个在其名称中提供了绑定的类。
第二种方法是显示的,即用一个被衍型化为bind的依赖,表明源端用实际参数对目标模板进行实例化。
10、标准元素
对类可以使用UML的所有扩展机制。最常见的情况是,
用标记值来扩展类的特性(如描述类的版本),
用衍型来描述新类型的构件(如特定模型的构件)。
UML定义了以下4种用于类的标准衍型。
(1)元类(metaclass)。说明一个类目,其对象全是类。
(2)幂类型(powertype)。说明一个类目,其对象是给定父类的子类。
(3)衍型(stereotype)。说明一个类目是可用于其他元素的衍型。
(4)实用程序(utility)。说明一个类,其属性和操作都是静态范围的。