从Java类库看设计模式(4) - 编程入门网
从Java类库看设计模式(4)时间:2011-04-23 IBM 刘武东在上一部分中,介绍了两个结构型的模式:Bridge和Decorator。这一部分的内容,将会 接着上面的讲解,继续我们的设计模式之旅。 这一部分,除了还会介绍一个结构型的Composite模式之外,还会有两个行为模式登场。 实际上在前面的内容中,我们已经接触到行为模式了:Observer和Command就是两个典型的行 为模式。行为模式更多的注重于算法和对象建间职责的分配,也就是说,它会更多的关注于 这个模式系统之类的各对象协作间的语义,以及在对象间进行通讯的流控制。 Composite模式 毫无疑问的,AWT中的Component-Container体系就是一个很好的Composite模式的例子。 Container继承于Component,而Container中有可以包含有多个Component,因为Container实 际上也是Component,因而Container也可以包含Container。这样通过Component-Container 结构的对象组合,形成一个树状的层次结构。这也就是Composite模式所要做的。 Composite模式是为了简化编程而提出的,一般的在编程的时候,如果严格的区分 Component和Container的话,有时候会带来许多不便,而且这些往往是没有必要的。比如, 我要在一个Container中放置一个Component,我并不需要知道这个Component到底是一个 Container,或者就是一个一般的Component,在父级容器中所要做的,只是记录一个 Component的引用,在需要的时候调用Component的绘制方法来显示这个Component。当这个 Component确实是一个Container的时候,它可以通过Container重载后的绘制方法,完成对这 个容器的显示,并把绘制消息传递给到它的子对象去。也就是说,对一个父级容器而言,它 并不不关心,其子对象到底是一个Component,还是一个Container。它需要将Component和 Container统一对待。 图十一:Composite模式的类图 Composite模式比较简单,实现起来也不复杂,但是有一定的局限性。比如,在处理树的 时候,我们往往需要处理三类对象:子树,页节点和非页节点。而在Composite模式中对于子 树和非叶节点的区分并不明显,而是把他们合成为一个Composite对象了。而且在GOF给出的 Composite的模式中,对于添加,删除子节点等属于Composite对象的的方法,是放在了 Component对象中的,这虽然在实现的时候可以区分开来,但容易造成一些概念上的误解。 由上所叙,我们可以提出一个改进了的Composite模式,引入子树对象,从而将子树和非 叶节点分开,如下图所示: 图十二:Composite模式的一种变体 从Java类库看设计模式(4)(2)时间:2011-04-23 IBM 刘武东虽然将Composite从Component类层次中分离出来,但并没有损害Composite模式的内涵。 这样做不一定就会比上面的那个要好,各有不同的应用,不过有时候用这样的方法来处理子 树要容易些,概念上也更为清晰。 下面的代码,给出了一个Composite模式简单的Java实现:
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |