你需要输出XML数据,但是本质上过程化的代码似乎是不对的。虽然通过反射可以将一个业务对象自动转换到XML中,但是除非经过复杂的精心设计,否则像日期和自定义格式化方面的问题将很快使任何工作都变得非常复杂。
最简单的选择就是为每一个业务对象都写一个toXml()方法,于是每一个业务对象都将打印输出它自己的所有属性,而当某属性就是另一个业务对象时,则调用那个对象的toXml()方法。这使得XML打印代码可以有权访问对象的私有域。
该方法看起应该是这个样子的:
publicString toXml( ) {
StringBuffer buffer = new StringBuffer( );
buffer.append("<person name="");
buffer.append(name);
buffer.append(""/>");
return buffer.toString();
}
然而,toXml()方法从两个方面来说是一种很糟糕的解决方案。首先,它假定XML数据应该作为String字符串形式创建。如果有非常多业务对象的话,它就会在内存中创建大量字符串,这会降低系统的性能。实际上,直接将XML写到一个Writer对象中会更好一些,不过这就要求抛出IOException异常。例如:
publicvoid toXml(Writer writer) throws IOException {
writer.write("<person name="");
writer.write(name);
writer.write(""/>");
}
之所以说toXml()很糟糕的第二个原因是因为了解如何输出它自己不应该是业务对象的工作。应该另有一个对象专职做这件事情,例如:
publicinterface PersonWriter {
public void write(Person person, Writer writer) throws IOException;
}
public class XmlPersonWriter implements PersonWriter {
public void write(Person person, Writer writer) throws IOException {
writer.write("<person name="");
writer.write(person.getName());
writer.write(""/>"); }
}
虽然这一新的系统不能再访问Person的私有变量,但是这对于一个面向对象的系统来说更加可取得多。首先调用PersonWriter,然后调用XmlPersonWriter或者FilePersonWriter,代码就可以输出来了。另外,XmlCompanyWriter可以重用XmlPersonWriter来输出为它工作的每一个人。如果你创建的类完成一项工作——即只做一件事情——的话,那么你为这个类所写的代码就会更有用和更稳定。