打印

一种组合方式:委托

[复制链接]
741|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keer_zu|  楼主 | 2015-8-17 16:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
委托
委托(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”。
委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。假定
矩形对象和圆对象有相同的类型,我们只需简单的用圆对象替换矩形对象,则得到的窗口就
是圆形的。

相关帖子

沙发
keer_zu|  楼主 | 2015-8-17 16:15 | 只看该作者
委托与那些通过对象组合以取得软件灵活性的技术一样,具有如下不足之处:动态的、
高度参数化的软件比静态软件更难于理解。还有运行低效问题,不过从长远来看人的低效才
是更主要的。只有当委托使设计比较简单而不是更复杂时,它才是好的选择。要给出一个能
确切告诉你什么时候可以使用委托的规则是很困难的。因为委托可以得到的效率是与上下文
有关的,并且还依赖于你的经验。委托最适用于符合特定程式的情形,即标准模式的情形。
有一些模式使用了委托,如S t a t e ( 5 . 8 )、S t r a t e g y ( 5 . 9 )和Vi s i t o r ( 5 . 11 )。在S t a t e模式中,一
个对象将请求委托给一个描述当前状态的S t a t e对象来处理。在S t r a t e g y模式中,一个对象将一
个特定的请求委托给一个描述请求执行策略的对象,一个对象只会有一个状态,但它对不同
的请求可以有许多策略。这两个模式的目的都是通过改变受托对象来改变委托对象的行为。
在Vi s i t o r中,对象结构的每个元素上的操作总是被委托到Vi s i t o r对象。

使用特权

评论回复
板凳
keer_zu|  楼主 | 2015-8-17 16:19 | 只看该作者
其他模式则没有这么多地用到委托。M e d i a t o r ( 5 . 5 )引进了一个中介其他对象间通信的对
象。有时, M e d i a t o r对象只是简单地将请求转发给其他对象;有时,它沿着指向自己的引用
来传递请求,使用真正意义的委托。Chain of Responsibility(5.1)通过将请求沿着对象链传递
来处理请求,有时,这个请求本身带有一个接受请求对象的引用,这时该模式就使用了委托。
B r i d g e ( 4 . 2 )将实现和抽象分离开,如果抽象和一个特定实现非常匹配,那么这个实现可以代
理抽象的操作。

委托是对象组合的特例。它告诉你对象组合作为一个代码复用机制可以替代继承。

使用特权

评论回复
地板
dong_abc| | 2015-8-18 19:56 | 只看该作者
楼主太寂寞了

使用特权

评论回复
5
dong_abc| | 2015-8-18 19:58 | 只看该作者
21ic估计没有几个像我这样还关注代码质量的

使用特权

评论回复
6
keer_zu|  楼主 | 2015-8-19 09:49 | 只看该作者
dong_abc 发表于 2015-8-18 19:58
21ic估计没有几个像我这样还关注代码质量的

21ic 很正常,像你我这样的人不多了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1349

主题

12426

帖子

53

粉丝