详细解述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">