一、组件及其图形表示
组件(Component)也叫构件,它遵循并实现了一套接口,是系统中可替换的部分。
一个系统可以通过组合组件来搭建,而组件的接口则说明了组件如何被组合在一起。
可以说,接口解耦了组件,使组件可以独立封装。 组件的图形表示如下:
组件的内部是由端口、部件和连接器实现的。
(一)端口
端口(port)是组件的对外窗口,组件通过它来收发消息。
如果说组件是一个售票大厅,那么端口就可以称之为售票窗口。售票员卖票,其他人购票都要通过售票窗口,类似地,组件收发消息也要通过端口。
前面我们提到组件实现了一套接口,这些接口就是通过端口来与组件内部通信的。
可以说,组件的接口附着在组件的端口上。
所以,端口进一步解耦了组件,使接口可以独立封装。
另外,如下文提到的,组件作为部件时,部件可以通过端口连接通信,这也进一步解耦了部件,使得部件可以独立封装。
每个端口都有一个名字,组件名和端口名组合在一起就可以唯一定位这个端口。
端口还有多重性,用来指明组件中端口可能的数量。
端口的图示如下:
如上图所示,“售票大厅”组件向外提供了四个端口:
- 座位种类可供外部查询有多少种座位
- 普通售票供普通用户使用
- 优先售票供优先用户使用
- 支付端口专门用来支付
(二)部件
部件(part)是组件内部的实现单元,具有名字、类型和多重性。
部件也可以是组件,也就是说组件的内部可以由组件来实现;如果部件是有端口的组件,那么可以通过端口来把它们连接起来,从而达到通信的目的。端口之间的连接叫作连接件(connector)。
部件的图示如下:
如上图所示,一个编译器组件由四部分组成:
- 一个词法分析器(Lexical Analyzer)
- 一个代码生成器(Code Generator)
- 一个语法分析器(Parser)
- 一到三个优化器(optimizer)
该编译器还提供了一个外部接口 Compile。
(三)连接件
连接件是两个部件或端口之间的通信关系,起到部件和部件之间的通信作用。
连接件主要有两类:
- 直接连接件
- 通过接口的连接件,也叫作装配连接件
如下图所示:
其中,直接连接件表明两个部件明确地捆绑在一起,这时直接在它们的端口之间画一根直线以表示通信关系。
有时,两个组件之间没有明确的捆绑关系,只是因为他们之间有兼容的接口,这时通过“拖球-插座”表示法来表示。
委派连接件是一种特殊的直接连接件,表示组件的外部端口指向内部端口的连接关系,因为外部端口的通信被委派给内部端口了,所以称之为“委派连接件”。
二、组件与接口
所谓接口是指一组操作的集合,其中的每个操作用于描述类或组件的一个服务。
如上文提到的,接口解耦了组件,使得一个组件在一个系统中,具备可替换性,只要它们遵循了同样的接口约定。
组件的接口及其图形表示
组件的接口分为两类:
- 供接口(provided interface)。即组件实现的接口,意思是组件向其他组件提供的作为一个服务的接口。
- 需接口(required interface)。即组件需要的接口,意思是组件向其他组件请求服务时所要遵循的接口。
接口的图示如下:
如上图所示,有两种方式来表示组件与接口的关系。
第一种方式(最通用的)是用简略的图形符号,一根类似于“棒棒糖”的图形表示供接口,而另一根残缺的半块“棒棒糖”表示需接口。
第二种方式更加详细地显示出了接口的操作,而接口与组件之间的联系则通过实现和使用关系来连接。
接口与端口
接口与端口都起到解耦的作用。
接口可以将一个系统中的组件分解,而端口则将组件和接口分解。更进一步,端口还将组件内部的部件分解。
组件与接口相连必须经过端口 。图示如下: