Ich arbeite an einer GUI-Anwendung, die eine Konfigurationsdatei generiert. Ich habe eine Klassenhierarchie für das Konfigurationsmodell und verwende einen Objektbaum dieser Hierarchie in verschiedenen Kontexten. Derzeit verwende ich das Besuchermuster, um zu vermeiden, dass meine Modellklassen mit kontextspezifischem Code verschmutzt werden.
interface IConfigurationElement {
void acceptVisitor(IConfigurationElementVisitor visitor);
}
In einer früheren Version habe ich instanceofanstelle des Besuchers Bedingungsketten verwendet. Beim Vergleich der beiden Ansätze sehe ich die folgenden Nachteile.
Besucher
- Es ist einfacher und sicherer, neue hinzuzufügen
IConfigurationElement. Fügen Sie einfach eine neue Deklaration hinzuIConfigurationElementVisitorund der Compiler generiert Fehler für alle Besucherimplementierungen. BeiinstanceofKetten müssen Sie sich alle Stellen merken, die Sie mit dem neuen Konfigurationselement erweitern müssen.instanceofVerstößt grundsätzlich gegen das DRY-Prinzip, da es die Logik an mehreren Stellen dupliziert. - Das Besuchermuster ist effizienter als eine Kette von
instanceofBedingungen
Instanz von
- Der große Vorteil von
instanceofist seine Flexibilität. Soinstanceofkann ich beispielsweise spezielle Lösungen für verschiedene Teilmengen vonIConfigurationElementImplementierungen definieren, die in einigen Fällen ähnlich behandelt werden müssen. Im Gegensatz dazu zwingt mich Visitor, jedes Mal eine Methode für jede Implementierungsklasse zu implementieren.
Gibt es eine gemeinsame Lösung für diese Art von Problem? Kann ich den Besucher irgendwie anpassen, damit ich in einigen Fällen eine gemeinsame Lösung anbieten kann?