1、关键抽象
声明了一个名为paint的操作,它的实现调用名为drawString的另一个操作,drawString操作负责在指定的位置上打印“Hello,World!”。在通常的面向对象的方式下,drawString是一个名称为g的参数上的一个操作,g的类型是类Graphics。
import java.awt.Graphics;
class HelloWorld extends java.applet.Applet
{
public void paint (Graphics g)
{
g.drawString("Hello,World!",10,10);
}
}
有上述代码实例,生成对应的UML模型
补充Applet和Graphics外部引用类,其中Applet 作为父类,属于泛化关系;Graphics 属于依赖关系(影响元素的变化)
更上层的泛化关系如下图所示,ImageObserver 作为接口元素
包之间的依赖关系,如下图所示,在UML中,包被表示成带有标签的文件夹,包可以被嵌套,邮箱的虚线段描述了包之间的依赖。
例如,HelloWorld 依赖包java.applet,java.applet依赖包java.awt。
2、机制
各部分如何协同工作
顺序图
序列从运行对象Thread开始,它调用Toolkit的一个操作run。对象Toolkit调用它自己的(callbackLoop),然后它调用ComponentPeer的操作handleExpose。对象ComponentPeer调用它的目标操作paint。对象ComponentPeer假设它的目标是Component,但在这种情况下,目标实际是Component的子类(即HelloWorld),因此,HelloWorld的操作paint被多态地处理。
3、制品
“Hello,World!”被实现为一个小应用程序(applet),它不是单独存在的,而通常是某个网页的一部分。打开含有该程序的网页,并由一些运行该程序的Thread对象的浏览器机制触发,程序就开始执行了。然而,直接作为网页一部分的并不是类HelloWorld,而是由Java编译器(它把描述该类的源代码转换成可执行的制品)产生的该类的二进制形式。这说明对一个系统存在非常不同的观察角度。所有早先的图描述的是程序的逻辑视图,这里所说的是applet的物理制品的视图。
制品图
逻辑类 HelloWorld 被表示成位于顶部的一个类矩形,这个图中的其他每个图符都表示了系统实现视图中一个UML制品。制品是一种物理表示,如文件。名为hello.java的制品表示了逻辑类HelloWorld的源代码,它是可以由开发环境和配置管理工具操纵的文件。用Java编译器可把这段源代码转换成二进制程序 HelloWorld.class,以使得它适合于在计算机的 Java虚拟机上执行。源代码和二进制程序都表现了(即物理上实现了)逻辑类,这被表示为带着关键字«manifest»的虚线箭头。
制品的图符是名字之上标注了关键字«artifact»的矩形
制品间的依赖用虚箭头表示