组件是可在其环境中替换的模块化单元。组件的内部部件是隐藏的,但它具有一个或多个定义完善的“提供的接口”,通过这些接口可以访问组件的功能。组件还可以具有“所需的接口”。所需的接口定义该组件需要其他组件中的哪些功能或服务。将多个组件的提供的接口和所需的接口相连接,可以构造更大的组件。完整的软件系统可以理解为是一个组件。
绘制组件图具有以下几个好处:
-
考虑与主要块有关的设计,可帮助开发团队理解现有设计并创建新设计。
-
认为系统是具有定义完善的提供接口和所需接口的组件集合,从而可以改进组件之间的分离。这反过来又使设计更易于理解,且在要求发生更改时可以更容易地做出相应更改。
无论设计已在使用或将要使用的语言或平台如何,您都可以使用组件图来表示您的设计。
您以将组件图与其他关系图结合使用。
其他关系图 | 帮助您讨论和传达设计的这些方面 |
---|---|
UML 序列图 |
有关详细信息,请参阅 UML 序列图:准则。 |
UML 类图 |
有关更多信息,请参见 UML 类图:准则。 |
活动图 |
有关更多信息,请参见UML 活动图:准则。 |
层关系图 |
有关更多信息,请参见层关系图:参考。 |
有关组件图中的元素的参考信息,请参见UML 组件图:参考。
有关如何在设计过程中使用组件图的更多信息,请参见建立软件系统体系结构模型。
说明 |
---|
创建任何建模图的详细步骤在编辑 UML 模型和关系图中进行介绍。 |
创建组件图
-
在“体系结构”菜单上,单击“新建关系图”。
-
在“模板”下,单击“UML 组件图”。
-
命名该关系图。
-
在“添加到建模项目”中,从您的解决方案中选择一个现有建模项目,或者选择“创建新的建模项目”,然后单击“确定”。
此时将显示一个新的组件图,同时显示 UML“组件图”工具箱。该工具箱中包含所需的元素和关系。
绘制组件
为系统或应用程序中的每个主要功能单元创建一个组件 (1)。
这方面的示例包括应用程序、硬件设备、Web 服务、.NET 程序集、程序类或一组类或者程序的任何可分段。
创建组件
-
单击工具箱中的“组件”,再单击关系图的空白部分。
- 或 -
复制并粘贴现有组件。
-
在关系图或“UML 模型资源管理器”中查找现有组件。
-
右击找到的组件,然后单击“复制”。
-
打开希望在其中显示复制的组件的关系图。
-
右击关系图的空白部分,然后单击“粘贴”。
组件的副本随即以新名称显示。
-
-
单击组件的名称以更改它。
-
如果您只想看到组件的标头,请单击 V 形 (5)。
显示组件的端口
端口(2、3)表示传入或传出组件的一组消息或操作调用。组由接口描述,而接口定义端口的类型。端口可以提供接口也可以需要接口。
具有提供的接口 (2) 的端口提供该组件实现的且其他组件可以使用的操作。
这方面的示例包括用户界面、Web 服务、.NET 接口或任何编程语言中的函数集合。
具有所需的接口 (3) 的端口表示组件需要其他组件或外部系统提供的一组操作或服务。
例如,Web 浏览器需要 Web 服务器,应用程序外接程序需要应用程序中的服务。
组件可以具有任意数量的端口。
将端口添加到组件
-
在工具箱中,单击“提供的接口”或“所需的接口”。
-
单击要将端口添加到的组件。
端口随即显示在组件的边界上。
新接口即作为端口的类型创建。此接口显示在“UML 模型资源管理器”中。
-
沿着组件边界拖动端口以将其放置在所需位置。
-
拖动端口的标签以调整其位置。
-
单击该标签以更改它。标签显示接口的名称。如果您更改了标签,则也更改了接口的名称。
若要列出接口的特性和操作,可在 UML 模型资源管理器中将这些特性和操作添加到接口来做到这一点。或者,可以将接口从 UML 模型资源管理器拖动到类图上,并在此位置添加操作和特性。
在组件之间进行链接
使用依赖项 (4) 以显示一个组件的要求可以通过其他组件提供的操作或服务来满足。
显示提供的接口可以满足所需的接口
-
在工具箱中,单击“依赖项”。
-
单击一个组件上具有所需的接口的端口,再单击另一个组件上具有提供的接口的端口。
应尝试避免设计依赖项循环,即组中的每个组件都依赖于所有其他组件。
将现有接口的端口添加到组件
-
在“UML 模型资源管理器”中找到所需接口,然后将其从所在位置拖动到组件。
- 或 -
-
复制引用并将其粘贴到关系图中的接口。
-
在类图或组件图上,右击该接口,然后单击“复制”。
-
在组件图上,右击组件,然后单击“粘贴引用”。
提供的接口随即显示在组件上。旁边显示了一个操作标记。
说明 如果您使用“粘贴”而不是“粘贴引用”,则将创建一个具有新名称的新接口。
-
如果您要创建所需的接口,请单击该操作标记,再单击“转换为所需的接口”。
-
可以将部件 (3) 放置在组件 (1) 中,以显示彼此进行交互的较小组件如何组成该组件。
插图中的关系图指明,类型“立即就餐 Web 服务”的每个实例都包含一个“顾客服务器”实例和一个“厨房服务器”实例。
部件是其父组件的属性,与属于普通类的特性非常类似。部件有其自己的类型,该类型通常也是组件。部件的标签与普通特性具有相同的形式:
+ partName : TypeName
在父组件内部,每个部件都显示了为其类型(4、5)定义的提供的接口和所需的接口。一个部件需要的操作或服务可以由另一个部件提供。可以使用“部件程序集”连接线显示部件相互连接的方式 (6)。
还可以显示父组件的某个部件实际提供还是需要该组件的接口。可以使用“委托”关系 (9) 将父组件的端口连接到内部部件的端口。这两个端口的类型必须相同(同时为提供或所需),且其接口类型应兼容。
可以使用新类型或通过现有类型创建新部件。
将部件添加到组件
-
为您认为是父组件的部件的每个主要功能单元创建一个部件。
-
单击工具箱中的“组件”,然后在父组件 (1) 中单击。
新部件 (3) 随即显示在父组件中。
即在“UML 模型资源管理器”中创建了一个新组件。此组件是新部件的类型。
- 或 -
将现有组件从 UML 模型资源管理器拖动到父组件。
新部件 (3) 随即显示在父组件中。其类型为从 UML 模型资源管理器拖动的组件。
- 或 -
在关系图或 UML 模型资源管理器中右击一个组件,然后单击“复制”。
右击父组件,然后单击“粘贴引用”。
新部件 (3) 随即显示在父组件中。其类型为所复制的组件。
-
单击新部件的名称以更改它。您无法更改该部件的类型。
-
可以将提供的接口和所需的接口(4、5)添加到新部件。单击“提供的接口”或“所需的接口”工具,然后在部件中单击。
- 或 -
将现有接口从“UML 模型资源管理器”拖动到该部件。
接口随即添加到部件的类型,并显示在部件本身上。父组件会根据需要调整接口的大小。
-
-
将部件相互连接。
-
使用“依赖项”工具连接不同部件 (6) 的端口。
-
-
将部件连接到父组件的端口:
-
在父组件上创建一个或多个端口 (7)。单击工具箱上的“所需的接口”或“提供的接口”,再单击父组件。
-
将端口委托 (9) 给一个或多个部件。单击“委托”工具,单击父组件上的端口,再单击部件上的端口。可以通过相同方式连接提供接口或需要接口的端口。
-
显示部件的多个部件
将组件分解为多个部件后,可以将每个部件类型分解为其自己的内部部件。
在单独的组件图中分解每个层最为简单。首先必须找到部件的类型。如插图所示,一个部件名为DNCustomerServer,且其类型是称为 CustomerServer 的组件。可以在 UML 模型资源管理器中找到该类型,并将其放置在其他关系图中。然后,您可以创建该类型自己的内部部件。
将部件的类型放置到关系图上
-
确定部件的类型的完全限定名。
右击该部件,然后单击“属性”。
类型的名称即显示在“属性”窗口的“类型”字段中。
-
在“UML 模型资源管理器”中找到部件的类型。
单击“视图”,指向“其他窗口”,再单击“UML 模型资源管理器”。
展开项目和该类型所属的任何包(如果需要)。
该类型将作为“组件”列出。
如果需要,可以在此处更改类型的名称。
-
打开或创建另一个组件图。
-
从 UML 模型资源管理器中的类型拖动到该关系图上。
类型的视图显示为关系图中的组件。
该组件具有的接口与您为部件定义的接口相同。
现在可以向组件中添加部件。
介绍部件的协作方式
您可以绘制一个序列图,以显示各部件如何协同工作以响应到达父组件的消息。
可以使用这些关系图来解释现有组件并设计新组件。
如果您仍要设计组件,则可以先绘制一些序列图,然后再确定该组件将包含哪些部件。可以使用这些序列图体验不同的部件、所需的接口和消息序列。为最常用且最重要的传入消息绘制序列图。然后可以在组件中创建与您已确定的生命线对应的部件。
使用序列图可以判断系统的工作在不同组件之间是如何分布的。
-
如果一个部件上堆集了太多工作,则与在各个部件之间平均分布工作相比,应用程序可能更难更新。
-
如果工作在多个交互操作之间分布得非常稀疏,则系统在执行时可能会出错且可能会难以理解。
绘制显示各部件间的协作的序列图
-
创建新的序列图。
有关更多信息,请参见 UML 序列图:准则。
-
为向组件发送消息的外部组件、用户、设备或其他参与者 (1) 创建生命线。
可以将此生命线的“参与者”属性设置为 True,以指示会考虑它位于组件的外部。在生命线上方会出现一个简图。
-
为所选参与者向其发送消息的组件的提供的接口 (2) 创建生命线。
-
为组件的每个部件 (3) 创建生命线。
-
为组件的每个所需的接口 (4) 创建生命线。
-
基于外部参与者 (5) 绘制消息。显示如何将消息传递给部件以及部件如何协同工作以响应消息。
-
根据需要,显示发送到所需的接口 (6) 的消息。不必显示执行消息时的任何详细信息。
组件是否比其部件要多?
在某些情况下,组件只是为部件集合指定的名称。所有工作都由部件完成,在运行时,没有任何表示组件的代码或其他项目。
您可以设置组件的“为间接实例化的”属性,在模型中指示这一点。在这种情况下,组件的所有接口都应位于端口上,且委托给内部部件。
介绍每个部件内的进程
可以使用活动图显示组件处理每个传入消息的方式。有关更多信息,请参见UML 活动图:准则。
使用“接受事件操作”(1) 显示传入消息启动新线程。
使用对象节点和输入/输出指针显示信息流和信息的存储位置。在示例中,对象节点 (2) 用于显示正在各个线程之间缓冲的项。
定义数据和类
可以使用 UML 类图描述以下方面的详细内容:
-
组件的接口。在将 requires 或 provides 端口添加到组件时,接口将显示在 UML 模型资源管理器中。你可以将此接口拖动或复制到 UML 类图中,以显示其特性和操作以及与其他接口的关系。
-
在接口的操作参数中传递的数据。
-
组件中存储的数据,例如活动图的对象流中所示。
组件之间的普通依赖项
使用组件图只是显示设计的主要部件及其相互依赖项。
使用“依赖项”工具绘制依赖项。这指示一个组件的设计依赖于另一个组件。
依赖项具有以下典型类型:
-
一个组件调用另一个组件中的代码。
-
一个组件实例化在另一个类中定义的类。
-
一个组件使用另一个组件创建的信息。
您可以使用依赖项箭头的名称来表示特定类型的使用情况。若要设置名称,请右击箭头,然后单击“属性”,并在“属性”窗口中设置“名称”字段。