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 instanceof
anstelle 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 hinzuIConfigurationElementVisitor
und der Compiler generiert Fehler für alle Besucherimplementierungen. Beiinstanceof
Ketten müssen Sie sich alle Stellen merken, die Sie mit dem neuen Konfigurationselement erweitern müssen.instanceof
Verstößt grundsätzlich gegen das DRY-Prinzip, da es die Logik an mehreren Stellen dupliziert. - Das Besuchermuster ist effizienter als eine Kette von
instanceof
Bedingungen
Instanz von
- Der große Vorteil von
instanceof
ist seine Flexibilität. Soinstanceof
kann ich beispielsweise spezielle Lösungen für verschiedene Teilmengen vonIConfigurationElement
Implementierungen 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?