详细解述7个软件开发原则[3]

文章作者 100test 发表时间 2007:06:08 11:54:23
来源 100Test.Com百考试题网


result.append(“ ”).
    result.append(“ total owed:” total “ ”).
    return result.toString().
    }
    }

  asciiStatement和htmlStatement具有类似的基础结构,但是它们的实际步骤却有所不同。他们都完成三件事情:
  1. 打印发票头
  2. 循环每一个项目,并打印
  3. 打印发票尾部 这种结构的相似性和意图马上上我们使用composed method(也就是Martin Fowler的Extract method):
   interface Printer {
    String header(Invoice iv).
    String item(LineItem line).
    String footer(Invoice iv).
   }
   static class AsciiPrinter implements Printer {
    public String header(Invoice iv) {
    return “Bill for “ iv.customer “\n”.
     }
    public String item(LineItem line) {
    return “\t” line.product() “\t\t” line.amount() “\n”.
     }
    public String footer(Invoice iv) {
    return “total owed:” iv.total “\n”.
     }
   }
 象html则可以实现htmlPrinter.
   class Invoice... public String statement(Printer pr) {
    StringBuffer result = new StringBuffer().
    result.append(pr.header(this)).
    Iterator it = items.iterator(). while(it.hasNext()) {
    LineItem each = (LineItem) it.next().
    result.append(pr.item(each)).
    }
     result.append(pr.footer(this)).
     return result.toString().
   }
   class Invoice... public String asciiStatement2() {
    return statement (new AsciiPrinter()).
   }
  现在,statement包含一个通用的结构,重复性已经被排除。更重要的是,你可以实现其它的Printer,XXXPrinter,从而能够轻易地扩展系统。
  BTW,Martin Fowler在这里使用了Dispatched Interpretation模式,statement隐瞒了内部的细节,它隐藏内部的数据和表示,当它需要Printer做一件事情时,它负责解码内部的数据结构,然后反过来把消息传给Printer.
  参见:Martin Fowler:Refactoring:Improve the design of Existing Code Kent Beck : Smalltalk Best Pratice Pattern ACM: Martin Fowler Design column:Reduce repetation Kent Beck: Extreme Programming Explained


src="/java/js/wxgg_java.js">

相关文章


通过用JAVAP反汇编来帮你理解Java特性
Java技巧:用匿名类来实现简化程序调试
用Eclipse MyEclipse Tomcat的环境配置
详细解述7个软件开发原则[3]
详细解述7个软件开发原则[1]
详细解述7个软件开发原则[2]
详细解述7个软件开发原则[2]
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛