Was meinst du mit "die Ausgabe soll über XML erfolgen"? Das ist mir dabei jetzt nicht ganz klar. Ansonsten ist das Template-Method-Pattern recht einfach.
Oft delegiert man Aufgaben an Klassen, ohne ihren konkreten Typ zu kennen. Und zwar über virtuelle Methoden. Diese haben allerdings einen Nachteil. Was ist, wenn man immer eine bestimmte Aktion ausführen möchte, die in der Basisklasse implementiert ist? Dann müsste jeder, der die virtuelle Methode überschreibt, auch immer die darüberliegende Funktion explizit aufrufen. Dies erfordert schon sehr viel Disziplin. Allerdings fehlt dann immernoch etwas: Und zwar das Wissen in der Basisklasse,
wann innerhalb einer geerbten virtuellen Methode die Basismethode aufgerufen wurde, und in
welchem Zustand sich das Objekt gerade befindet.
Das ist sehr gefährlich. Beispielsweise dann, wenn die Basismethode den Zustand des Objektes ändert, die abgeleitete Methode aber nach fehlschlägt und eigentlich das Objekt in den Ursprungzustand versetzen müsste. Das geht so nun einfach nicht mehr.
Dafür bietet sich das Template-Method-Pattern an.
Code:
class Base
{
public:
void doSomething();
protected:
virtual void internalDoSomething() = 0;
};
void Base::doSomething()
{
/// in einem definierten Zustand vorher etwas tun
/// die eigentlich virtuelle Methode aufrufen
internalDoSomething();
/// in einem definierten Zustand nachher etwas tun
}
Beispielsweise für Datenbank-Klassen bietet sich in der Template-Methode (hat nichts mit dem C++-Sprachfeature gemein) das Aufrufen von Ereignissen wie "beforeUpdate" und "afterUpdate" an, die sonst nicht so einfach zu implementieren wären.