Dieser Artikel beschreibt die Verwendung des Besuchermodus, um das hierarchische Strukturdiagrammproblem des Unternehmens zu lösen. Teilen Sie es für Ihre Referenz wie folgt weiter:
1. Musterdefinition
Besuchermodus: Repräsentiert eine Operation, die auf jedes Element in einer Objektstruktur wirkt. Damit kann der Benutzer neue Operationen definieren, die auf diese Elemente reagieren, ohne die Klasse jedes Elements zu ändern.
2. Modellbeispiele
1 Musteranalyse
Wir leihen uns die Firmenhierarchie aus, um dieses Modell zu veranschaulichen.
2 Besuchermodus Statische Klassendiagramm
3 Code Beispiele
3.1 Abstrakte Mitarbeiter
Paket com.demo.structure; import com.demo.visitor.ivisitor;/** * abstrakte Mitarbeiterklasse * * @Author * */public abstract Class Staff {// Angestellte Nummer geschützt String Nr.; // Mitarbeitername Protected String Name; // Position geschützte String Position; // Gehalt, das Gehalt des Gehalts geschützt; // private Eigenschaft Länge Zeichenfolge Private int Länge; // Methode Construct Public Staff (String No, String -Name, String -Position, Float -Gehalt) {this.no = no; this.name = name; this.position = Position; this.Salary = Gehalt; // Berechnen Sie die Gesamtbytelänge. 0: Nr. GETBYTES (). Länge; this.Length += (name == null || "" .equals (name.trim ()))? 0: Position.getBytes (). Länge; this.Length += (Position == null || "" .Equals (Position.trim ()))? 0: Position.getBytes (). Länge; this.Length += string.Valueof (Gehalt) .getBytes (). Länge; } // grundlegende Benutzerinformationen public void PrintuserBaseinfo () {System.out.println ("-|" + this.no + "" + this.name + "" + this.position + "" + this.Salary) erhalten; } // Mitarbeiterinformationen öffentlich abstraktes Leerraum hinzufügen (Mitarbeiter); // Mitarbeiter des Arbeitnehmers öffentliche abstrakte Mitarbeiter entfernen (String No); // Besucherobjekt öffentliche abstrakte Leere akzeptieren (IVisitor -Besucher); public String getNo () {return no; } public void setNo (String no) {this.no = no; } public String getName () {return name; } public void setName (String -Name) {this.name = name; } public String getPosition () {return Position; } public void setPosition (String -Position) {this.position = Position; } public float getSalary () {Return -Gehalt; } public void setSalary (Float -Gehalt) {this.Salary = Gehalt; }}3.2 Manager
Paket com.demo.structure; import Java.util.ArrayList; importieren com.demo.visitor.ivisitor;/** * Manager (jemand mit anderen Mitarbeitern unter seinem Befehl) * * @Author * */Public Class Manager erweitert Mitarbeiter {// Informationen über Mitarbeiter private arraylist <personal> Arraylist = New Arraylist <Personal>; // Methode CONSTRUCT METHODE PUCTION Manager (String No, String -Name, String -Position, Float -Gehalt) {Super (nein, Name, Position, Gehalt); } / *** Fügen Sie einen Mitarbeiter hinzu* / @Override public void add (Staff) {this.ArrayList.add (Staff); } / *** Mitarbeiterinformationen löschen* / @Override öffentliche Mitarbeiter entfernen (String No) {Staff = null; if (nein! } if (Nr. Equals (this.ArrayList.get (i) .getno ()) {staff = this.arrayList.remove (i); brechen; }}} return staf; } // Besucherobjekt @Override public void Accept (IVisitor -Besucher) {// Zugriff auf Ihren eigenen Besucher.VISIT (this); // Verschiedene Elementobjekte in der Liste "Listenliste" und empfangen Sie Besucherobjekt für (int i = 0; i <this.arrayList.size (); i ++) {if (this.ArrayList.get (i) == null) {Fortsetzung; } // Besucherobjekt this.ArrayList.get (i) .Accept (Besucher); }}}3.3 Gewöhnliche Mitarbeiter
Paket com.demo.structure; import com.demo.visitor.ivisitor;/** * gewöhnliche Mitarbeiter (echte Personen, die arbeiten) * * @Author * * */öffentliche Mitarbeiter -Mitarbeiter erweitern Mitarbeiter (// konstruieren Methoden öffentliche Mitarbeiter (String Nr. } / *** Fügen Sie Mitarbeiterinformationen hinzu* / @Override public void add (Staff) {return; } / *** Mitarbeiterinformationen löschen* / @Override öffentliche Mitarbeiter entfernen (String No) {// Null direkt an null zurückgeben; } // das Besucherobjekt öffentliche void Accept (IVisitor Besucher) {Visitor.vissit (this); }}3.4 Besucher-Schnittstelle-Issistor
Paket com.demo.visitor; import com.demo.structure.Amployees; import com.demo.structure.manager;/** * Besucherschnittstelle * * @Author * */öffentliche Schnittstelle Ivisitor {// Access Manager Public Void Visit (Manager Manager); // Zugang zu normalen Mitarbeitern öffentlicher Leere (Mitarbeiter Mitarbeiter);}3.5 Basisinformationen für Mitarbeiter Besucher Printbasieinfovistor
Paket com.demo.visitor; import com.demo.structure.Amployees; import com.demo.structure.manager;/*** grundlegende Informationen Besucher** @Author**/public class printbaseinfovisitor implements ivisitor {/*** Access Manager Objekt*/öffentlicher Void-Void-Besuch (Manager). Manager.printuserbaseinfo (); } / *** Zugriff auf gewöhnliches Mitarbeiterobjekt* / public void Visit (Mitarbeiter Mitarbeiter) {System.out.print ("- Allgemeiner Mitarbeiter:"); Mitarbeiter.printuserbaseinfo (); }}3.6 Erstellen Sie eine Besucherschnittstelle für die Angabe von Mitarbeiterngehältern - ISALARYVISTOR
Paket com.demo.visor;/** * Berechnen Sie den Gehaltsbesucher * * @Author * */public interface iSalaryvisitor erweitert IVisitor {// Statistics Manager Gehalt public void printManagertotalary (); // Statistik Allgemeine Mitarbeitergehalt öffentlich void PrintEPOPOTOTALSALARY (); // Statistik Alle Mitarbeiter Gehalt Public void Printotalary ();}3.7 Statistiken des Arbeitnehmergehalts und der Besucher, um einen Gehaltsverzeichnis zu realisieren
Paket com.demo.visitor; import com.demo.structure.Anlyees; import com.demo.structure.Manager;/** * Spezifische Implementierung der Berechnung des Gehaltsbesucheres * * @Author * */öffentliche Klassengehalts -Implementierung ISALARYVISITOR {// Total Manager Gehalt Privat Float Manageralary; // Gesamtgehalt der normalen Arbeitnehmer private Float -Arbeitssaalary; public Gehaltvisor () {ManagerSalary = 0; Mitarbeiter = 0; } // Access Manager Public void besuchen (Manager Manager) {Manageralary += Manager.getSalary (); } // Besuchen Sie die allgemeinen Mitarbeiter öffentlicher Leere (Mitarbeiter Mitarbeiter) {Employmentalary += Employees.getSalary (); } // Statistik Das Gehalt der allgemeinen Mitarbeiter public void PrintEPOPOPOTALALARY () {System.out.println ("Allgemeine Mitarbeitergehaltsumme:" + Mitarbeiter); } // Statistik Das Gehalt der Manager public void printManagertotalsalary () {System.out.println ("Manager -Gehaltsumme:" + Manageralary); } // Statistiken der Gehälter aller Mitarbeiter public void Printotalary () {System.out.println ("Arbeitgebergehalt:" + (Managersalary + Mitarbeiter)); }}3.8 Kunden testen einen Kunden
Paket com.demo; import com.demo.structure.EMPLET; static void main (String [] args) {// Firma -CEO -Staff boss = neuer Manager ("1", "Big Boss", "CEO", 100000); / *** Der CEO hat mehrere Abteilungsleiter*/ // Finanzabteilungsleiter Personal Financanager = New Manager ("11", "Präsident Zhang", "Finanzmanager", 60000); // Personalnelmanager des Personalabteilung Manager des Personals für Personalabteilung = neuer Manager ("12", "Präsident Wang", "Präsident Manager", 60000); // Mitarbeiter des technischen Abteilungsleiters technischemmanager = neuer Manager ("13", "Präsident Chen", "Technischer Abteilungsleiter", 60000); / *** Es gibt auch Assistenten und mehrere Vorgesetzte in der technischen Abteilung* // Assistent der technischen Abteilung Assistent. // technischer Abteilung Direktor1 Staff DeptManager1 = neuer Manager ("1302", "Supervisor1", "Technischer Direktor", 30000); / ** * technischer Direktor DeptManager1 Es gibt auch Software -Ingenieure (die Person, die am Ende arbeitet) */ Staff SoftwareEngineer1 = neue Mitarbeiter ("1302001", "Zhang San", "Software Engineer", 5000); Staff SoftwareEngineer2 = neue Mitarbeiter ("1302002", "Li Si", "Software Engineer", 5500); Staff SoftwareEngineer3 = neue Mitarbeiter ("1302003", "Wang Wu", "Software Engineer", 4500); // Mitarbeiterinformationen für den technischen Supervisor 1 DEPTMANAGER1.ADD (SoftwareEngineer1) hinzufügen; DeptManager1.ADD (SoftwareEngineer2); DeptManager1.ADD (SoftwareEngineer3); // Direktor für technische Abteilung 2 Mitarbeiter DeptManager2 = neuer Manager ("1303", "Supervisor2", "Technischer Direktor", 30000); // Hinzufügen: Assistent der Abteilung, technischer Direktor 1 und technischer Direktor 2 TechnicalManager.Add (Abteilung); TechnicalManager.Add (DeptManager1); TechnicalManager.Add (DeptManager2); // Marketing Manager Staff MarketingManager = neuer Manager ("14", "Mr. Wu", "Market Manager", 60000); // CEO hinzufügen: Finanzabteilungsleiter, Personalabteilungsleiter, technischer Abteilungsleiter und Marketingmanager -Chef.Add (Finanzmittel); Boss.Add (Personalnelmanager); Boss.Add (TechnicalManager); boss.add (MarketingManager); // CEO -Informationen drucken // boss.printuserbaseinfo (); // Drucken Sie den Mitarbeiter des CEO -Informationen des CEO (Accept (New PrintBaseinFovisitor ()); / *** Statistik -Mitarbeitergehalt* // Erstellen Sie ein Statistik -Mitarbeiter Gehalt Besucher Gehaltsfassitor Besucher = neuer Gehaltsvisor (); // Lassen Sie den Big -Chef den Besucherchef akzeptieren. Accept (Besucher); // Manager Gehaltsstatistik Besucher.printManAGertotalsalary (); // Allgemeine Mitarbeitergehaltstatistik Besucher.PrintaPlOPOPOTALSALARY (); // alle Mitarbeitergehaltstatistiken Besucher.PrintTotalsalary (); }}4 Auslaufergebnisse
- Manager: - | 1 CEO von Big Boss 100000.0
- Manager: - | 11 General Zhang Finance Department Manager 60000.0
- Manager: - | 12 General Wang Human Resources Department Manager 60000.0
- Manager: - | 13 General Chen Technischer Abteilungsmanager 60000.0
- Manager: - | 1301 Assistent Wang Abteilung Assistent 20000.0
- Manager: - | 1302 Supervisor 1 Technischer Supervisor 30000.0
- Allgemeine Mitarbeiter: - | 1302001 Zhang San Software Engineer 5000.0
- Allgemeine Mitarbeiter: - | 1302002 Li SI Software Engineer 5500.0
- Allgemeine Mitarbeiter: - | 1302003 Wang Wu Software Engineer 4500.0
- Manager: - | 1303 Supervisor 2 Technischer Supervisor 30000.0
- Manager: - | 14 General Manager Wu Marketing Department 60000.0
Gesamtverwaltungsgehalt: 420.000,0
Gesamtgehalt der allgemeinen Mitarbeiter: 15000,0
Gesamtgehalt des Arbeitnehmers: 435.000,0
III. Die Designprinzipien dieses Musters
1 "Open-Close" -Prinzip
2 Prinzip der Einzelverantwortung
4. Verwenden Sie Anlässe
1 Wenn Sie viele verschiedene Arten von Objekten in eine Objektstruktur aufnehmen, haben sie unterschiedliche Schnittstellen und möchten einige Operationen implementieren, die von bestimmten Klassen auf diesen verschiedenen Objekten abhängen.
2 Sie müssen viele verschiedene und nicht verwandte Operationen für Objekte in einer Objektstruktur ausführen, und Sie möchten vermeiden, dass diese Operationen mit den Klassen dieser Objekte in Verbindung gebracht werden. Der Besuchermodus ermöglicht es, verwandte Operationen in einer Klasse zentralisiert und separat zu definieren.
3 Wenn diese Objektstruktur von vielen Anwendungen gemeinsam genutzt wird, können Sie den Besuchermodus verwenden, damit jeder Anwendung nur die Vorgänge enthalten, die verwendet werden müssen.
4 Die Klassen, die die Objektstruktur definieren, ändern sich selten, aber häufig sind neue Operationen in dieser Struktur zu definieren.
5. Visitor Mode Static Class Diagramm
Für mehr Java-bezogene Inhalte können Leser, die an dieser Website interessiert sind, die Themen anzeigen: "Java-Datenstruktur und Algorithmus-Tutorial", "Zusammenfassung der Java-Operation DOM-Knoten-Tipps", "Zusammenfassung der Java-Datei- und Verzeichnisoperationstipps" und "Zusammenfassung von Java Cache Operation Tipps" "
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.