组件

一、组件及其图形表示

组件(Component)也叫构件,它遵循并实现了一套接口,是系统中可替换的部分。

一个系统可以通过组合组件来搭建,而组件的接口则说明了组件如何被组合在一起。

可以说,接口解耦了组件,使组件可以独立封装。 组件的图形表示如下:

UML简明教程,组件的图形表示
组件的内部是由端口、部件和连接器实现的。

(一)端口

端口(port)是组件的对外窗口,组件通过它来收发消息。

如果说组件是一个售票大厅,那么端口就可以称之为售票窗口。售票员卖票,其他人购票都要通过售票窗口,类似地,组件收发消息也要通过端口。

前面我们提到组件实现了一套接口,这些接口就是通过端口来与组件内部通信的。

可以说,组件的接口附着在组件的端口上。

所以,端口进一步解耦了组件,使接口可以独立封装。

另外,如下文提到的,组件作为部件时,部件可以通过端口连接通信,这也进一步解耦了部件,使得部件可以独立封装。

每个端口都有一个名字,组件名和端口名组合在一起就可以唯一定位这个端口。

端口还有多重性,用来指明组件中端口可能的数量。

端口的图示如下: 端口
如上图所示,“售票大厅”组件向外提供了四个端口:

  • 座位种类可供外部查询有多少种座位
  • 普通售票供普通用户使用
  • 优先售票供优先用户使用
  • 支付端口专门用来支付

(二)部件

部件(part)是组件内部的实现单元,具有名字、类型和多重性。

部件也可以是组件,也就是说组件的内部可以由组件来实现;如果部件是有端口的组件,那么可以通过端口来把它们连接起来,从而达到通信的目的。端口之间的连接叫作连接件(connector)。

部件的图示如下:
部件的 UML 表示
如上图所示,一个编译器组件由四部分组成:

  • 一个词法分析器(Lexical Analyzer)
  • 一个代码生成器(Code Generator)
  • 一个语法分析器(Parser)
  • 一到三个优化器(optimizer)
    该编译器还提供了一个外部接口 Compile。

(三)连接件

连接件是两个部件或端口之间的通信关系,起到部件和部件之间的通信作用。

连接件主要有两类:

  • 直接连接件
  • 通过接口的连接件,也叫作装配连接件

如下图所示:
UML 连接件
其中,直接连接件表明两个部件明确地捆绑在一起,这时直接在它们的端口之间画一根直线以表示通信关系。

有时,两个组件之间没有明确的捆绑关系,只是因为他们之间有兼容的接口,这时通过“拖球-插座”表示法来表示。

委派连接件是一种特殊的直接连接件,表示组件的外部端口指向内部端口的连接关系,因为外部端口的通信被委派给内部端口了,所以称之为“委派连接件”。

二、组件与接口

所谓接口是指一组操作的集合,其中的每个操作用于描述类或组件的一个服务。

如上文提到的,接口解耦了组件,使得一个组件在一个系统中,具备可替换性,只要它们遵循了同样的接口约定。

组件的接口及其图形表示

组件的接口分为两类:

  • 供接口(provided interface)。即组件实现的接口,意思是组件向其他组件提供的作为一个服务的接口。
  • 需接口(required interface)。即组件需要的接口,意思是组件向其他组件请求服务时所要遵循的接口。

接口的图示如下: 组件与接口
如上图所示,有两种方式来表示组件与接口的关系。
第一种方式(最通用的)是用简略的图形符号,一根类似于“棒棒糖”的图形表示供接口,而另一根残缺的半块“棒棒糖”表示需接口。
第二种方式更加详细地显示出了接口的操作,而接口与组件之间的联系则通过实现和使用关系来连接。

接口与端口

接口与端口都起到解耦的作用。

接口可以将一个系统中的组件分解,而端口则将组件和接口分解。更进一步,端口还将组件内部的部件分解。

组件与接口相连必须经过端口 。图示如下: 接口与端口

用户头像
登录后发表评论