快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
下的 TreeVisitor 完成了这些:

清单 7. 用一个访问者来跟踪 TreePrinter 的缩进

import java.io.OutputStream; import java.io.PrintStream; class TreePrinter implements TreeVisitor {   private int amountOfIndentation;   // The stream to which we are printing.   PrintStream out;   public TreePrinter() {    this.amountOfIndentation = 0;    this.out = System.out;   }   public TreePrinter(OutputStream _out) {    this();    this.out = new PrintStream(_out);   }   TreePrinter(int _amountOfIndentation) {    this();    this.amountOfIndentation = _amountOfIndentation;   }   TreePrinter(int _amountOfIndentation, OutputStream _out) {    this();    this.amountOfIndentation = _amountOfIndentation;    this.out = new PrintStream(_out);   }   /**   * Prints an amount of whitespace proportional to the   * current degree of indentation.   */   public void indent() {    for (int i = 0; i < this.amountOfIndentation; i++) {     this.out.print("  ");    }   }   public Object forLeaf(Leaf that) {    // Since leaves are empty, they are not printed.    // Returns a dummy object to satisfy TreeVisitor interface.    return new Object();   }   public Object forBranch(Branch that) {    TreePrinter innerPrinter =     new TreePrinter(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();   } }

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

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

但另一方面,当我们扩展这个 TreeVisitor 以包含单元素叶这种情况时,先的方法将构造错误的 TreeVisitor 类型实例:

清单 8. 单元素叶导致 TreePrinter 构造类型错误的实例

class TreePrinter2 extends TreePrinter implements TreeVisitor2 {   public TreePrinter2(int _amountOfIndentation) {    super(_amountOfIndentation);   }   public Object forNonEmptyLeaf(NonEmptyLeaf that) {    this.indent();    this.out.println(that.getValue());    // Returns a dummy object to satisfy TreeVisitor interface.    return new Object();   } } ...   // But the inherited method forBranch will construct an   // instance of TreePrinter, not TreePrinter2!   public Object forBranch(Branch that) {    TreePrinter innerPrinter =     new TreePrinter(this.amountOfIndentation + 1, this.out);    this.indent();    this.out.println(that.getValue());    that.left.accept(innerPrinter);    that.right.accept(innerPrinter);    // Returns a dummy object to satisfy TreeVisitor interface.    return new Object();   }

如果 TreeCopier2 的一个实例试图访问一个 Tree ,而这个 Tree 带有是 NonEmptyLeaf 的双亲的一个 Branch ,则在 NonEmptyLeaf 的 accept 方法中强制类型转换成 TreeVisitor2 将失败。

一种答案:向工厂(factory)方法求助

这个问题的一个解决方案,最初是由 Krishnamurthi 等人提出的(请参阅 参考资料),该解决方案是用工厂方法而不是构造器来构造

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