委托模式:委托模式

委托模式:委托模式

ID:38165000

大小:256.18 KB

页数:6页

时间:2019-06-01

委托模式:委托模式_第1页
委托模式:委托模式_第2页
委托模式:委托模式_第3页
委托模式:委托模式_第4页
委托模式:委托模式_第5页
资源描述:

《委托模式:委托模式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、委托模式撰文/透明梗概委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能。场景扩展和复用一个类的功能常用的一种方法是继承,而另一种更普遍的方法则是委托。在很多情况下委托很适用,而继承则并不适用。另外在[MEYERS98]中也讲到,公有继承表现的设计思想是1“is-a-kind-of”,私有继承表现的设计思想则是“is-implemented-in-terms-of”,这些关系都是静态的、不能在运行时改变的。而在一些情况下我们需要表现的设计思想是“is-a-rol

2、e-played-by”的关系,在这些情况下不应该用继承的方法。下面用一个例子来帮助说明。假设我们为一个航空公司设计软件系统,于是我们必须用一些类来表示各种各样的“人”,包括机组人员、售票员、旅客等等。一种思路是这样:因为这些人都是抽象的“人”,因此设计一个Person抽象类,并从这个抽象类衍生出我们需要的各种类。由此我们得到下面的类图:图1:用继承的方法建模这个设计方案的问题是很明显的:一个机组人员在休假的时候可能乘坐飞机而成为一个旅客;航空公司也可能把机组人员调去做售票员⋯⋯是的,一个人可能成为三种角色中的任何一种。如果我们

3、一定要坚持继承的思路,那么我们可能得到下面这个图:(见下页图2)1[MEYERS98]的ITEM35指出,public继承表示“is-a”的关系,也就是这里所说的“is-a-kind-of”。1很明显我们遇到了“类爆炸”的问题。我们这里只有三个角色,就需要用七个衍生类来表现所有的情况。如果我们有六个角色呢?我们将需要63个衍生类。(我画图2用了15分钟的时间,如果要画63个衍生类⋯⋯呵呵,呵呵)而且即使使用了这么多衍生类,我们仍然有困难。因为继承所表现的“is-a-kind-of”关系是静态的,在编译时就固定了。而一个“人”可能

4、在不同的时间扮演不同的角色,于是我们可能需要用多个对象来表现同一个“人”的不同角色,这也是一件相当麻烦的事情。而另一方面,如果我们用委托的方式来表现这个问题,我们可以得到一个相当优雅的解决方案,上面提到的问题都自然的解决了。这样的解决方案如图3所示:图2:继承解决方案的发展(类爆炸的实例)图3:使用委托的建模2约束如果你发现一个对象需要在不同的时间“成为”不同的衍生类,那么首先这个对象根本不应该“是”一个衍生类。因为一个对象一旦作为衍生类被创建出来,它就只能是这个衍生类的实例而不能扮演其他角色了。另一方面,一个对象可以在不同的时

5、间把不同的行为委托给不同的对象。如果你发现一个衍生类在试图隐藏其超类的方法或变量,这说明这个类根本不应当从这个超类衍生得到,因为根本没有什么合理的理由来隐藏超类的方法或变量。但另一方面,如果使用委托的设计方法,你就可以随意选择需要的方法或变量。把一个类设计成现有的具体类的衍生类也不是一件值得推荐的事情。(这个话题的C++版本在[MEYERS96]中有非常详细的介绍,因此我就不在这里赘言了。)“不适当的继承”在实际中被如此广泛的应用,以至于可以把它们归纳成一种“反模式(antipattern)”了。正如上面所说的,继承一个具体类可

6、能导致各种无法预料的问题。实际上,可能绝大多数对类的功能的扩展和复用都不应该使用继承。解决方案委托是对类的行为进行复用和扩展的一条途径。它的工作方式是:包含原有类的实例引用,实现原有类的接口,将对原有类方法的调用转发给内部的实例引用。图4展示了本模式的一般形式:图4:使用委托模式对类的行为进行复用和扩展委托的用途比继承更加广泛。用继承能实现的对类的任何形式的扩展都可以用委托的方式完成。因此在[GoF]中也建议尽量用委托代替继承。参与者lDelegator(委托者)-保存Delegate的实例引用。-实现Delegate的接口。-

7、将对Delegate接口方法的调用转发给Delegate。lDelegate(受委托者)-接受Delegator的调用,帮助Delegator实现其接口。效果3使用委托模式可以避免继承方法遇到的问题。另外,使用委托模式可以很容易的在运行时对其行为进行组合。委托模式的主要缺点是类之间的联系、类体系结构不如继承那样清楚明显。不过也有一些方法可以改善这些联系的清楚程度。l使用一致并且清楚的名称,让程序的读者可以直观的知道Delegator和Delegate之间的联系。比如说,如果用一个类来代理一些Widget衍生类的创建,那么把这个类

8、命名为WidgetFactory就是不错的方法。l在程序中写上适当的注释,告诉读者:这里使用委托模式。l遵循LawofDemeter模式[GRAND99],即:如果两个类之间只有间接联系,采用间接委托;如果有直接联系,采用直接委托。这可以减少类之间的联系数量。l

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。