Das, worüber sich die Autoren von Design Patterns am meisten Sorgen machten, war das "Besuchermuster".
Es ist ein "notwendiges Übel" - wird aber oft überstrapaziert und die Notwendigkeit zeigt oft einen grundlegenderen Fehler in Ihrem Design.
Ein alternativer Name für das Muster "Besucher" ist "Mehrfachversand", da das Besuchermuster genau das ist, was Sie erhalten, wenn Sie eine Versand-OO-Sprache mit einem Typ verwenden möchten, um den zu verwendenden Code basierend auf dem Typ von zwei auszuwählen (oder mehr) verschiedene Objekte.
Das klassische Beispiel ist, dass Sie den Schnittpunkt zwischen zwei Formen haben, aber es gibt einen noch einfacheren Fall, der oft übersehen wird: den Vergleich der Gleichheit zweier heterogener Objekte.
Wie auch immer, oft hat man so etwas:
interface IShape
{
double intersectWith(Triangle t);
double intersectWith(Rectangle r);
double intersectWith(Circle c);
}
Das Problem dabei ist, dass Sie alle Ihre Implementierungen von "IShape" miteinander gekoppelt haben. Sie haben impliziert, dass Sie, wenn Sie der Hierarchie eine neue Form hinzufügen möchten, auch alle anderen "Form" -Implementierungen ändern müssen.
Manchmal ist dies das richtige Minimal-Design - aber denken Sie darüber nach. Erfordert Ihr Design wirklich , dass Sie zwei Typen versenden müssen? Sind Sie bereit, jede der kombinatorischen Explosionen von Multi-Methoden zu schreiben?
Durch die Einführung eines anderen Konzepts können Sie häufig die Anzahl der Kombinationen reduzieren, die Sie tatsächlich schreiben müssen:
interface IShape
{
Area getArea();
}
class Area
{
public double intersectWith(Area otherArea);
...
}
Natürlich kommt es darauf an - manchmal muss man wirklich Code schreiben, um all diese verschiedenen Fälle zu behandeln -, aber es lohnt sich, eine Pause einzulegen und nachzudenken, bevor man den Sprung wagt und Visitor verwendet. Es könnte Ihnen später viel Schmerz ersparen.