诊断Java代码: 设计可扩展的应用程序,第2部分 - 编程入门网
访问者的新实例。然后这些工厂方法将在原始访问者的任何子类中被覆盖。
在我们的示例中,可以通过把以下的工厂方法包含到类 TreePrinter 中做到这一点: 清单 9. 往 TreePrinter 添加工厂方法
要这样做,类 TreePrinter 中构造新 TreePrinters 的任何方法都应该调用方法 newTree() 。 诊断Java代码: 设计可扩展的应用程序,第2部分(5)时间:2011-02-11 IBM Eric E. Allen因此, TreePrinter 的 forBranch() 方法将写成如下所示: 清单 10. TreePrinter 的 forBranch 方法
然后,如果需要扩展类 TreePrinter 以包含用于新数据类型的方法,则我们只需在新类中覆盖 newTree() 以返回适当类型的实例就行了。 例如,我们可以象下面这样覆盖类 TreePrinter2 的方法 newTree() : 清单 11. 覆盖 TreePrinter2 的 newTree 方法
这个解决方案称为 可扩展访问者模式(Extensible Visitor Pattern)。 结束语:性能对可扩展性 因此,有了以上的设计,现在我们可以很容易地添加 Trees 上的功能性和类 Tree 的新的子类型。当然,我们将为这一可扩展性付出性能方面的代价。 当数据上的算法是递归地进行定义时,这种类型的可扩展性做得最好,但不幸的是,在 Java 语言中,递归调用的花费可能很昂贵,而且对大型数据结构,这种调用很容易就会产生堆栈溢出。 通过在可能的情况下对方法调用进行动态内联,最新的 JIT 编译器减轻了这个问题。此外,最新的 IBM JIT 编译器也进行 尾调用清除,这至少对防止尾递归方法上的堆栈溢出有帮助。 幸运的是,实际上,程序中我们想让它具有最大可扩展性的部件,通常都不是性能最关键的部件。在那些情形中,按本文描述的方式使用可扩展设计是最有利的。下一次,我将讨论与黑箱可扩展性有关的一些问题。 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |