Вообще говоря, вы хотите, чтобы код форматирования XML (или другого ...) объекта был отдельным для самого объекта. Практическая причина этого заключается в желании иметь более одного представления XML (скажем, краткое и подробное представление). Если эти методы используют всю часть API объекта, вы начинаете иметь:
public String GetShortXml(){ ... }
public String GetFullXml(){ ... }
public String GetCsv(){ ... }
public String GetJson(){ ... }
Как часть API каждого бизнес-объекта, и это становится ужасно быстрым. Кроме того, это нарушает принцип единоличной ответственности , поскольку каждый класс отвечает за то, что делает id, и представляет себя как XML, JSON, CSV и т. Д.
Таким образом, часто лучше иметь класс, который знает, как форматировать интересующие вас бизнес-объекты, и иметь SummaryXmlFormatter, DetailXmlFormatter, CsvFormatter, JsonFormater и т. Д.
Вы можете сделать еще один шаг, и ваши объекты реализуют интерфейс IFormattable (ниже приведена адаптация шаблона для посетителей , который дает нам двойное качество отправки):
public interface IFormattable {
public String Format(IFormatter formatter);
}
с реализациями вроде:
public String Format(IFormatter formatter){
return formatter.FormatBusinessObjectOne(this);
}
с интерфейсом IFormatter, определенным таким образом:
public interface IFormatter{
public String FormatBuisinessObjectOne(BusinessObjectOne boo);
public String FormatBuisinessObjectTwo(BusinessObjectTwo bot);
...
}
Что позволило бы полиморфно отправлять ваши звонки на форматирование. В зависимости от ваших требований может или не может быть полезным (у вас когда-либо есть коллекция различных типов и, следовательно, требует полиморфной отправки или достаточно перегрузки?).
Ваши вызовы для форматирования будут выглядеть следующим образом:
IFormatter formatter = new XmlFormatter();
BusinessObjectOne boo = new BusinessObjectOne(...);
// With visitor like double dispatch
String xml = boo.Format(formatter);
// Without
String xml = formatter.FormatBusinessObjectOne(boo);
// With overloading
String xml = formatter.Format(boo);