23 Designmuster Kapitel 16: Java -Besuchermuster
Definition: Kapuliert bestimmte Operationen, die in einer bestimmten Datenstruktur auf jedes Element wirken. Es kann neue Operationen definieren, die auf diese Elemente reagieren, ohne die Datenstruktur zu ändern.
Typ: Verhaltensmuster
Klassendiagramm:
Der Besuchermodus ist möglicherweise der komplexeste Modus unter Verhaltensmodi, aber dies kann kein Grund sein, warum wir ihn nicht beherrschen.
Schauen wir uns zuerst ein einfaches Beispiel an, der Code ist wie folgt
Klasse A {public void method1 () {System.out.println ("Ich bin ein"); } public void method2 (b b) {B.Showa (this); }} Klasse B {public void showa (a a) {a.method1 (); }}Schauen wir uns hauptsächlich an, was der Unterschied zwischen Methode Methode1 und Methode Method2 in der Klasse A ist. Methode Methode1 ist sehr einfach. Drucken Sie einfach einen Satz "Ich bin ein" aus. Methode Methode2 ist etwas komplizierter, verwenden Sie die Klasse B als Parameter und rufen Sie die Showa -Methode der Klasse B.
Schauen wir uns die Showa -Methode der Klasse B an. Die Showa -Methode verwendet Klasse A als Parameter und ruft dann die Methode1 -Methode der Klasse A auf. Das laufende Ergebnis sollte auch "Ich bin ein" sein. Lassen Sie uns nach der Analyse diese beiden Methoden ausführen und das Run -Ergebnis sehen:
public class test {public static void main (String [] args) {a = new a (); a.method1 (); A.Method2 (neu B ()); }}Das laufende Ergebnis ist:
Ich bin ein
Ich bin ein
Nach dem Verständnis dieses Beispiels verstehen Sie 90% des Besuchermusters. Im Beispiel für Klasse A ist Klasse B ein Besucher. Dieses Beispiel ist jedoch nicht der gesamte Besuchermodus. Obwohl es intuitiv ist, hat es eine schlechte Skalierbarkeit. Sprechen wir über die allgemeine Implementierung des Besuchermodus. Sie können das Klassendiagramm durchsehen, dass im Besuchermodus die folgenden Rollen hauptsächlich enthalten sind:
Zusammenfassung Besucher: Eine abstrakte Klasse oder Schnittstelle, die deklariert, auf welche Elemente, auf die der Besucher zugreifen kann. Insbesondere im Programm definieren die Parameter in der Besuchsmethode, auf welche Objekte zugegriffen werden können.
Besucher: Implementieren Sie die von abstrakten Besuchern deklarierte Methode, die sich auswirkt, was Besucher tun sollten und was sie nach dem Zugriff auf eine Klasse tun sollen.
Abstrakte Elementklasse: Eine Schnittstelle oder eine abstrakte Klasse, die erklärt, welche Art des Besucherzugriffs akzeptiert wird. Das Programm wird durch Parameter in der Akzeptanzmethode definiert. Es gibt im Allgemeinen zwei Arten von Methoden für abstrakte Elemente, eine ist eine eigene Geschäftslogik, und der andere ist, auf welche Art von Besuchern zugreifen dürfte.
Elementklasse: Implementiert die von der abstrakte Elementklasse deklarierte Akzeptanzmethode, normalerweise Besucher.
Strukturobjekt: Ein Elementcontainer enthält im Allgemeinen einen Container, der mehrere verschiedene Klassen und Schnittstellen wie Listen, Set, Karte usw. berücksichtigt. Diese Rolle wird im Projekt selten abstrahiert.
Gemeinsame Code -Implementierung des Besuchermodus
Abstract Classelement {public abstract void Accept (IVisitor -Besucher); öffentliche abstrakte Leeredosen (); } Schnittstelle Ivisitor {public void Visit (konkreteElement1 EL1); öffentlicher Leerraumbesuch (ConcreteElement2 EL2); } class ConcreteElement1 erweitert Element {public void dosomething () {System.out.println ("Dies ist Element 1"); } public void Accept (IVisitor -Besucher) {Visitor.VISIT (this); }} class ConcreteElement2 erweitert das Element {public void dosomething () {System.out.println ("Dies ist Element 2"); } public void Accept (IVisitor -Besucher) {Visitor.VISIT (this); }} Klasse Besucher implementiert IVisitor {public void Visit (concreteElement1 el1) {el1.dosomething (); } public void Visit (ConcreteElement2 el2) {el2.dosomething (); }} class ObjectStruture {public static list <element> getList () {list <element> list = new ArrayList <element> (); Random ran = new random (); für (int i = 0; i <10; i ++) {int a = ran.nextint (100); if (a> 50) {list.add (neuer konkreteLement1 ()); } else {list.add (new ConcreteElement2 ()); }} Rückgabeliste; }} public class client {public static void main (string [] args) {list <element> list = ObjectStrus.getList (); für (Element E: Liste) {e.accept (neuer Besucher ()); }}} Vorteile des Besuchermodus
Entsprechen Sie dem Prinzip der einzigen Verantwortung: In jedem Szenario, in dem der Besuchermodus anwendbar ist, müssen die Operationen, die im Besucher in der Elementklasse eingekapselt werden müssen, Operationen sein, die wenig mit der Elementklasse selbst zu tun haben und volatil sind. Einerseits entspricht die Verwendung des Besuchermodus dem Prinzip der einzelnen Verantwortung und andererseits, da die eingekapselten Operationen normalerweise volatil sind. Wenn Änderungen auftreten, kann die Erweiterung des sich ändernden Teils erreicht werden, ohne die Elementklasse selbst zu ändern.
Gute Skalierbarkeit: Elementklassen können unterschiedliche Vorgänge erweitern, indem sie verschiedene Besucher akzeptieren.
Anwendbare Szenarien für den Besuchermodus
Wenn in einem Objekt einige Operationen vorhanden sind, die nicht mit dem Objekt (oder schwach verwandt) zusammenhängen, und um zu vermeiden, dass diese Operationen das Objekt kontaminieren, können Sie den Besuchermodus verwenden, um diese Operationen in den Besucher einzudämmen.
Wenn in einer Gruppe von Objekten ähnliche Operationen vorhanden sind, können diese doppelten Vorgänge auch in den Besucher eingekapselt werden, um eine große Anzahl doppelter Code zu vermeiden.
Der Besuchermodus ist jedoch nicht so perfekt und hat auch fatale Fehler: Das Hinzufügen neuer Elementklassen ist schwieriger. Durch den Code des Besuchermusters können wir sehen, dass in der Besucherklasse jede Elementklasse ihre entsprechende Verarbeitungsmethode hat. Das heißt, jede Elementklasse muss hinzugefügt werden, um die Besucherklasse (auch die Unterklasse oder die Implementierungsklasse der Besucherklasse) zu ändern, was zu ändern ist. Das heißt, wenn die Anzahl der Elementklassen ungewiss ist, sollte der Besuchermodus mit Vorsicht verwendet werden. Daher eignet sich der Besuchermodus besser zum Wiederaufbau bestehender Funktionen. Wenn beispielsweise die grundlegenden Funktionen eines Projekts bestimmt wurden, wurden die Daten von Elementklassen im Grunde ermittelt und ändert sich nicht. Alles, was sich ändern wird, sind die relevanten Operationen innerhalb dieser Elemente. Zu diesem Zeitpunkt können wir den Besuchermodus verwenden, um den ursprünglichen Code neu zu gestalten, damit die ursprünglichen Funktionen geändert werden können, ohne jede Elementklasse zu ändern.
Zusammenfassen
Als GOF beschreibt der Autor von Designmuster den Besuchermodus: In den meisten Fällen müssen Sie den Besuchermodus verwenden, aber sobald Sie ihn benötigen, benötigen Sie es wirklich. Natürlich ist das nur für die wirklich großen Jungs. In der Realität (zumindest in der Umgebung, in der ich mich befinde) sind viele Menschen oft von Designmustern abhängig. Bei Verwendung eines Entwurfsmusters überlegen sie nie ernsthaft, ob das von ihnen verwendete Muster für dieses Szenario geeignet ist, möchten aber oft nur ihre Fähigkeit zeigen, objektorientiertes Design zu steuern. Wenn Sie diese Mentalität beim Programmieren haben, missbrauchen Sie häufig das Designmuster. Daher müssen Sie beim Lernen von Entwurfsmustern die Anwendbarkeit der Muster verstehen. Es ist notwendig, ein Muster zu verwenden, da Sie seine Vorteile verstehen und kein Muster verwenden, da Sie seine Nachteile verstehen. Anstatt ein Muster zu verwenden, weil Sie seine Nachteile nicht verstehen, um kein Muster zu verwenden, da Sie seine Vorteile nicht verstehen.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.