快速业务通道

诊断Java代码: 深度优先访问器和中断的分派 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
构时,使用访问器是最佳的选择(虽然对于它还有一些方法可用,如“Extensible Visitor 模式”)。

然而,还有另一个大的缺点。当以同一种方法处理复合层次结构中的许多类时,访问器中的代码将比放置在类本身中的代码大许多(因为我们可能只将一个缺省实现放入父类)。

幸好,普通访问器有一个变体,它不仅解决了这个问题,而且在许多情况下可以让我们使代码比它在放入个别类时更加简单。我们将这个变体称为 Depth-First Visitor 模式。

Depth-first visitor 模式

Depth-First Visitor 模式的基本思想如下:大多数访问器都以深度优先的方式向下递归一个数据结构。这意味着它们在访问给定的(非叶)节点本身之前,先访问它的子节点。

因此,我们可以在抽象 visitor 类的 for* 方法中实现深度优先遍历,然后让具体实现简单地描述每种数据类型如何组合访问子节点的结果。这些描述放置在特殊的 for*Only() 方法中,这些方法将访问其子节点的结果作为方法的参数。

例如,清单 2 演示了如何重写二叉树上的深度优先访问器:

清单 2. 深度优先访问器

abstract class DepthFirstTreeVisitor implements TreeVisitor {   public abstract Boolean forLeafOnly(Leaf that);   public abstract Boolean forBranchOnly(Branch that,                      Boolean left_result,                      Boolean right_result);   public Boolean forLeaf(Leaf that) {    return forLeafOnly(that);   }   public Boolean forBranch(Branch that) {    Boolean left_result = that.left.accept(this);    Boolean right_result = that.right.accept(this);    return forBranchOnly(that, left_result, right_result);   } }

现在,我们可以如清单 3 中所示的那样重写 ZeroFinder 访问器。

清单 3. 重新访问的 ZeroFinder

abstract class DepthFirstTreeVisitor implements TreeVisitor { class DepthFirstZeroFinder extends DepthFirstTreeVisitor {   public Boolean forLeafOnly(Leaf that) {    return new Boolean(false);   }   public Boolean forBranchOnly(Branch that,             Boolean left_result,                 Boolean right_result)   {    if (that.value == 0) { return new Boolean(true); }    return new Boolean(left_result.booleanValue() ||             right_result.booleanValue());   } }

这样,我们已经使许多深度优先遍历的复杂技术与具体的访问器分离,并将这些复杂的技术放入(共享的)抽象父类。另外,对于每种类型,深度优先访问器的实现将有一个容易获得(在 for*Only() 方法的签名中)的包含了所有组件的列表。

诊断Java代码: 深度优先访问器和中断的分派(3)

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

复杂的层次结构如何?

这实际上相当于我们可以为这个简单的复合层次结构做些什么。但是,对于更复杂的类层次结构,我们可以做更多的事情。

通常,对于许多类的复合层次结构,一个给定的访问器能以一个公共(或通用)方法来处理许多情况。当访问器代替一对 instanceof 检查时,这尤为适用。对于这些情况,我们可以提供 for*Only() 方法的缺省实现,这些方法只是调用一个抽象的 defaultCase() 方法:

清单 4. 添加了一个缺省情况

abstract class DepthFirstTreeVisitor implements TreeVisitor {   public abstract Boolean defaultCase(Tree that);   public Boolean forLeafOnly(Leaf that) {    return defaultCase(that);   }   public Boolean forBranchOnl

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