类和对象的关系有:使用关系,包含关系,和关联关系;类和类之间的关系有:继承关系;那么什么是使用关系呢? 使用关系就是一个类的对象向另一个类的对象发送消息(即调用它的方法)。本文就描述一下使用关系的六种方法,其实包含关系也是使用关系的一种,所以应该包含在使用关系中。
如果一个对象要向另一个对象发送消息,那么这个对象必须知道另一个对象的名字。 让我们来思考一个问题:汽车和加油站的关系,汽车要加油必须知道加油站的名字,如果让汽车包含加油站,那显然不合理,那么汽车如何知道加油站的名字呢?除了包含关系,还有5种实现方法。
1. 通过消息的方法。
想象一下一个更高层次的对象向轿车发送了一个消息,其中的参数包含加油站的名字,比如汽车对象有一个方法: AddGas(gasStationInfo& gasstation, int money); 上层对象调用它,将加油站的信息当作参数发给汽车对象。
2. 查询另一个类(地图类),找到合适的加油站(或许是离的最近的加油站)
这种方法假设有另一个地图类,保存着加油站的分布位置,那么汽车根据自己的位置查询此类来获得和自己离的最近的加油站,然后去加油。当然这个只是暂时回避了问题(我们如何知道地图对象呢?)
3. 使用一个全局对象
所有的汽车使用一个全局的加油站对象,这个实际是第一种方法的一个特例,因为全局对象可以认为是方法的一个隐式参数。
4. 随时创建型
这种方法是为有钱人设计的,当汽车需要加油时,就停下车,在原地建一个加油站,然后在使用这个加油站。在离开时,再摧毁它。简单的说,就是在AddGas方法中,创建一个局部的加油站对象。
5. 包含引用型
这种方法是在造车时,就指定了这个车使用哪个加油站,也就是说,车对象中一个指针(指向加油站),在创建车对象时,就指定了这个指针,让其指向一个指定的加油站对象。
6. 最后一种也是最常用的就是包含关系。当然这个例子不适合这种方法,总不能让汽车包含一个加油站对象吧!所以来说另一个例子,就说一个DIALOD类,其中包含几个控件,比如包含一个ListCtrl,那么每次来自上层应用类的消息,有一部分都要转发给ListCtrl类来执行。比如要得到第三行的字符串,那么dialog对外有一个GetListStr(int nLine);而这个方法实现其实是调用listctrl对象的某一个方法。这就是包含,dialog对象包含listctrl对象。这种包含关系其实到处都用。
上述六种使用关系,各有优缺点,针对不同问题用不同的方法!!
本文参考文献:
《OOD启思录》, 人民邮电出版社,作者: J.Riel
《设计模式精解》 清华大学出版社,熊杰译。
--------------------next---------------------
阅读(210) | 评论(0) | 转发(0) |