委托
委托(d e l e g a t i o n)是一种组合方法,它使组合具有与继承同样的复用能力[ L i e 8 6 , J Z 9 1 ]。在
委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给它的代理者
(d e l e g a t e)。这类似于子类将请求交给它的父类处理。使用继承时,被继承的操作总能引用接
受请求的对象,C + +中通过t h i s成员变量, S m a l l t a l k中则通过s e l f。委托方式为了得到同样的
效果,接受请求的对象将自己传给被委托者(代理人),使被委托的操作可以引用接受请求的
对象。
举例来说,我们可以在窗口类中保存一个矩形类的实例变量来代理矩形类的特定操作,
这样窗口类可以复用矩形类的操作,而不必像继承时那样定义成矩形类的子类。也就是说,
一个窗口拥有一个矩形,而不是一个窗口就是一个矩形。窗口现在必须显式的将请求转发给
它的矩形实例,而不是像以前它必须继承矩形的操作。
下面的图显示了窗口类将它的A r e a操作委托给一个矩形实例。
箭头线表示一个类对另一个类实例的引用关系。引用名是可选的,本例为“ r e c t a n g l e”。
委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。假定
矩形对象和圆对象有相同的类型,我们只需简单的用圆对象替换矩形对象,则得到的窗口就
是圆形的。
|