插座变量的连接

来源:互联网 发布:店面装修软件下载 编辑:程序博客网 时间:2024/04/29 07:21
面向对象编程的部分任务就是处理对象构成的网络结构。这种网络结构并不一定是静止的,它可能随着程序的运行而相应的发生改变。对象间的关系也可能根据需而即时产生,对象所扮演的角色也可能随时改变。然后,这一切都会有个规律,就和角色都会有个剧本一样。

有些对象间的连接可能非常短暂。例如,一条消息中包含一个参数,这个参数指向的对象是消息的发送者。对象的接收者可能会发送一条响应消息给参数标识的对象,该响应消息包含了消息接收者本身或者其它需要消息发送者进一步交互的对象。上述对象之间的连接是很短晢的,仅随着消息链产生而产生。

但是并不是所有对象之间的连接都是这么临时产生的, 有一些连接是需要在程序的数据结构中记录的。有很多方法可以实现这一目的。例如可以用一个表格记录对象之间的关系,或者使用一组服务通过名字来标识对象。然而,最简单的方法是给每一个对象赋予一些实例变量来记录需要通讯的其它对象。这些实例变量叫做插座变量(outlet),因为它们记录了消息的出口——程序中对象之间最主要的连接关系。

虽然插座变量的命名可以是任意的,但是其名字一般反映了这些插座变量本身所扮演的角色。比如说图 4-1中一个对象有四个插座变量——"agent",“friend”,“neighbor“,“boss”。这些变量所指向的对象可能会随时改变,但是它们所扮演的角色是一样的。


图 4-1 插座变量

对象的某些插座变量可能在对象第一次初始化时就设定好了,并不再改变。有一些可能在随后的某些操作中被设置,也有一些可以调用对象提供的方法自由的随时设置。

插座变量被设置后,应用程序的组织结构自然地体现出来。它们使对象连接成一个互相通讯的网络,就跟用水系统因为管道而联系在一起,个体通过社会关系而联系在一起一样。
本节包含如下内容:

内部连接和外部连接
对象网络的激活

内部连接和外部连接

插座变量可以表示对象间多种类型的关系。有时候表示的是在程序中或多或少有一些交互的两个对象,且这两个对象各有自己角色,互不统属。例如,装置对象可能有一个插座变量标识了和该装置对象连接的阀门对象。

有时候表示的两个对象之间是从属的关系。一个对象会被看做另外一个对象的一部分。例如水龙头对象可能会使用一个水表对象来记录使用的水的数量。该水表对象仅服务于该水龙头对象。与装置对象和阀门对象的外部连接相比,水龙头对象和水表对象的连接属于内部连接。

类似的,一个对象也会有插座变量记录所有由该对象统属的对象列表。例如,建筑对象可能有该建筑内所有的管道对象列表,这些管道对象可以被认为是该建筑的一部分,它们间的连接属于内部连接,然而管道和其它管道之间属于外部连接。

内部插座变量和外部插座变量有很大的不同。一个对象被释放或者归档到磁盘上的文件时,该对象的内部插座变量所指向的对象必须随之被释放或者归档。例如,如果水龙头对象被释放了,则服务于该水龙头的水表对象必须随之被释放。如果水龙头对象归档时,它的水表对象没有随之归档,则当它被重新载入到内存中时,该水龙头对象是无意义的(除非它自己可以创建一个新的水表对象)。

而外部插座变量描述的是程序的组织结构,其所指向的对象也是程序中相对独立的组件。例如,当一个装置对象被释放时,它所连接的阀门对象仍然会存在。当一个被归档的装置重新载入到内存中时,它会连接到另外一个阀门对象并开始工作。
对象网络的激活

对象网络一般是由外界因素的促进而启动的。例如,如果您的程序是和用户接口交互的,则需要响应用户对键盘和鼠标的操作。一个对数据进行处理的程序则随着数据的输入而开始运行。有的程序可能会对电话线路的数据,从数据库获得的信息,监视程序运行的进程的状态做出响应。

程序可能会捕捉一系列的事件,以及外部活动的状态。例如,具有用户界面的程序会接收到鼠标的点击事件和键盘的按键事件,并对此做出响应。面向对象的程序结构能够比较好的适应这种用户驱动类型的应用。