快速业务通道

从Java类库看设计模式(4) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

从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模式的类图

从Java类库看设计模式(4) - 编程入门网

Composite模式比较简单,实现起来也不复杂,但是有一定的局限性。比如,在处理树的 时候,我们往往需要处理三类对象:子树,页节点和非页节点。而在Composite模式中对于子 树和非叶节点的区分并不明显,而是把他们合成为一个Composite对象了。而且在GOF给出的 Composite的模式中,对于添加,删除子节点等属于Composite对象的的方法,是放在了 Component对象中的,这虽然在实现的时候可以区分开来,但容易造成一些概念上的误解。

由上所叙,我们可以提出一个改进了的Composite模式,引入子树对象,从而将子树和非 叶节点分开,如下图所示:

图十二:Composite模式的一种变体

从Java类库看设计模式(4) - 编程入门网

从Java类库看设计模式(4)(2)

时间:2011-04-23 IBM 刘武东

虽然将Composite从Component类层次中分离出来,但并没有损害Composite模式的内涵。 这样做不一定就会比上面的那个要好,各有不同的应用,不过有时候用这样的方法来处理子 树要容易些,概念上也更为清晰。

下面的代码,给出了一个Composite模式简单的Java实现:

public abstract class Component{    public abstract void operation();    public void add(Component component){};    public void remove(Component component){}; } import java.util.*; public class Composite extends Component{    String name;    ArrayList children = new ArrayList();    public Composite(String name){      this.name = name;    }    public void add(Component component){      children.add(component);    }    public void remove(Component component){      children.remove(component);    }    public void operation(){      System.out.println(name);      Iterator iterator = children.iterator();    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号