快速业务通道

诊断Java代码: 设计可扩展的应用程序,第2部分 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
访问者的新实例。然后这些工厂方法将在原始访问者的任何子类中被覆盖。

在我们的示例中,可以通过把以下的工厂方法包含到类 TreePrinter 中做到这一点:

清单 9. 往 TreePrinter 添加工厂方法

// in class TreePrinter:   TreePrinter newTree(int _amountOfIndentation, OutputStream _out) {    return new TreePrinter(_amountOfIndentation, _out);   }

要这样做,类 TreePrinter 中构造新 TreePrinters 的任何方法都应该调用方法 newTree() 。

诊断Java代码: 设计可扩展的应用程序,第2部分(5)

时间:2011-02-11 IBM Eric E. Allen

因此, TreePrinter 的 forBranch() 方法将写成如下所示:

清单 10. TreePrinter 的 forBranch 方法

// in class TreePrinter:   public Object forBranch(Branch that) {    TreePrinter innerPrinter =     newTree(this.amountOfIndentation + 1, this.out);    this.indent();    this.out.println(that.getValue());    that.getLeft().accept(innerPrinter);    that.getRight().accept(innerPrinter);    // Returns a dummy object to satisfy TreeVisitor interface.    return new Object();   }

然后,如果需要扩展类 TreePrinter 以包含用于新数据类型的方法,则我们只需在新类中覆盖 newTree() 以返回适当类型的实例就行了。

例如,我们可以象下面这样覆盖类 TreePrinter2 的方法 newTree() :

清单 11. 覆盖 TreePrinter2 的 newTree 方法

// in class TreePrinter2:   TreePrinter newTree(int _amountOfIndentation, OutputStream _out) {    return new TreePrinter2(_amountOfIndentation, _out);   }

这个解决方案称为 可扩展访问者模式(Extensible Visitor Pattern)。

结束语:性能对可扩展性

因此,有了以上的设计,现在我们可以很容易地添加 Trees 上的功能性和类 Tree 的新的子类型。当然,我们将为这一可扩展性付出性能方面的代价。

当数据上的算法是递归地进行定义时,这种类型的可扩展性做得最好,但不幸的是,在 Java 语言中,递归调用的花费可能很昂贵,而且对大型数据结构,这种调用很容易就会产生堆栈溢出。

通过在可能的情况下对方法调用进行动态内联,最新的 JIT 编译器减轻了这个问题。此外,最新的 IBM JIT 编译器也进行 尾调用清除,这至少对防止尾递归方法上的堆栈溢出有帮助。

幸运的是,实际上,程序中我们想让它具有最大可扩展性的部件,通常都不是性能最关键的部件。在那些情形中,按本文描述的方式使用可扩展设计是最有利的。下一次,我将讨论与黑箱可扩展性有关的一些问题。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号