Cet article décrit l'utilisation du mode des visiteurs pour résoudre le problème du diagramme de structure hiérarchique de l'entreprise. Partagez-le pour votre référence, comme suit:
1. Définition du modèle
Mode visiteur: représente une opération qui agit sur chaque élément d'une structure d'objet. Il permet à l'utilisateur de définir de nouvelles opérations qui agissent sur ces éléments sans modifier la classe de chaque élément.
2. Exemples de modèle
1 analyse de modèle
Nous empruntons la hiérarchie de l'entreprise pour illustrer ce modèle.
2 Diagramme de classe statique du mode visiteur
3 exemples de code
3.1 Personnel abstrait
package com.demo.structure; import com.demo.visitor.ivisitor; / ** * Résumé Classe d'employés * * @Author * * / Public Résumé Classe Personnel {// Numéro d'employé String Protected NO; // Nom de l'employé Nom de la chaîne; // position de position de la chaîne protégée; // salaire du salaire protégé du salaire; // Longueur de propriété privée Longueur privée int privé; // Construire le personnel public de la méthode (chaîne no, nom de chaîne, position de chaîne, salaire float) {this.no = no; this.name = name; this.position = position; this.salary = salaire; // Calculez la longueur d'octet total this.length + = (no == null || "" .equals (n ° trim ()))? 0: No.getBytes (). Longueur; this.length + = (name == null || "" .equals (name.trim ()))? 0: position.getBytes (). Longueur; this.length + = (position == null || "" .equals (position.trim ()))? 0: position.getBytes (). Longueur; this.length + = string.valueof (salaire) .getBytes (). la longueur; } // Obtenez des informations de base utilisateur public void printUserBaseInfo () {System.out.println ("- |" + this.no + "" + this.name + "" + this.position + "" + this.salary); } // ajouter des informations sur les employés publics abstraits void Add (personnel du personnel); // Supprimer le personnel abstrait public des employés (chaîne no); // reçoit un objet visiteur public abstrait vide accepter (visiteur ivisitor); String public getno () {return non; } public void setNO (String no) {this.no = no; } public String getName () {Nom de retour; } public void setName (string name) {this.name = name; } public String getPosition () {position de retour; } public void setPosition (position de chaîne) {this.position = position; } public float getSalary () {return salaire; } public void setsalary (salaire float) {this.salary = salaire; }}3.2 Manager
Package com.demo.structure; import java.util.arraylist; import com.demo.visitor.ivisitor; / ** * Manager (quelqu'un avec d'autres employés sous leur commande) * * @author * * / Gestionnaire de classe public étend le personnel {// Store Informations sur les employés des employés ArrayList final <Sindémarrage> ArrayList = New ArrayList <Stravent> (); // Construire la méthode Public Manager (chaîne no, nom de chaîne, position de chaîne, salaire float) {super (non, nom, position, salaire); } / ** * Ajouter un employé * / @Override public void add (personnel du personnel) {this.arrayList.add (personnel); } / ** * Supprimer les informations des employés * / @Override Public du personnel Supprimer (String NO) {Staff Staff = NULL; if (non! = null &&! "". equals (n ° Trim ())) {for (int i = 0; i <this.arrayList.size (); i ++) {if (this.arrayList.get (i) == null) {continuant; } if (n ° Equals (this.arrayList.get (i) .getNo ())) {Staff = this.arrayList.Remove (i); casser; }}} Return personnel; } // recevoir un objet visiteur @Override public void accepter (Ivisitor Visitor) {// Accédez à votre propre visitor.Visit (this); // Traversé divers objets d'élément dans la liste de liste et recevoir un objet Visitor pour (int i = 0; i <this.arrayList.size (); i ++) {if (this.arrayList.get (i) == null) {continué; } // recevoir un objet visiteur this.arrayList.get (i) .Accept (visiteur); }}}3.3 Employés ordinaires
package com.demo.structure; import com.demo.visitor.ivisitor; / ** * employés ordinaires (de vraies personnes travaillant) * * @author * * / public Employés étend le personnel {// Construire la méthode des employés publics (chaîne no, nom de chaîne, position de chaîne, salaire flottant) {super (non, nom, poste, salaire); } / ** * Ajouter des informations sur les employés * / @Override public void add (personnel du personnel) {return; } / ** * Supprimer les informations des employés * / @Override Personnel public Supprimer (chaîne NO) {// Renvoie Null directement à NULL; } // Recevoir l'objet Visitor public void accepter (Ivisitor Visitor) {Visitor.Visit (this); }}3.4 Interface des visiteurs-IVISIOR
package com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager; / ** * interface visitor * * @author * * / interface publique ivisitor {// Access Manager public void Visit (Manager Manager); // Accès aux employés ordinaires Visite du public (employés des employés);}3.5 Informations de base des employés Visiteurs Printbaseinfovistor
package com.demo.visitor; import com.demo.structure.employes; import com.demo.structure.manager; / ** * imprimer le visiteur de base * * @author * * / public class printbaseinfovitor implémente ivisitor {/ ** * Access Manager objet * / public Void Visit (Manager Manager) {System.out.print ("- Manager:"); manager.printUserBaseInfo (); } / ** * Accédez à l'objet de l'employé ordinaire * / Public Void Visit (Employés employés) {System.out.print ("- Employé général:"); employés.printUserBaseInfo (); }}3.6 Créer une interface de visiteur pour indiquer les salaires des employés - IsalaryVistor
Package com.demo.visitor; / ** * Calculer le visiteur salarial * * @Author * * / Interface publique IsalaryVisitor étend iVisitor {// Statistics Manager Salaire public void printManAgertotalsalary (); // Statistiques Salaire d'employé général Public Void PrintEmployeStotOlAnary (); // Statistiques Tous les employés Salaire public void printtotalsalary ();}3.7 Statistiques du salaire des employés et des visiteurs pour réaliser un salaire
Package com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager; / ** * implémentation spécifique du visiteur salarial calculant * * @Author * * / classe publique SalaryVisitor implémente IsalaryVisitor {// Total Manager Salaire Salaire Private Float Managersalary; // Salaire total des employés ordinaires employés privés employés de flotteur; public SalaryVisitor () {managersalary = 0; EmployEessalary = 0; } // Access Manager Public Void Visit (Manager Manager) {Managersalary + = Manager.getSalary (); } // Visitez les employés ordinaires Visite publique (employés employés) {Employeessalary + = employés.getsalary (); } // Statistiques le salaire des employés généraux publics void PrintEmployEestotalsalary () {System.out.println ("Somme de salaire des employés généraux:" + EmployEessalary); } // Statistiques Le salaire des managers public void printManAgertotalsalary () {System.out.println ("Somme de salaire du gestionnaire:" + managersalary); } // Statistiques de tous les salaires de tous les employés VOID PRINTTOTALALARY () {System.out.println ("Salaire de l'employeur:" + (Managersalary + EmployEessalary)); }}3.8 Client testant un client
package com.demo; import com.demo.structure.employees; import com.demo.structure.manager; import com.demo.structure.staff; import com.demo.visititor.printbaseinfovisitor; import co.demo.visitor.salaryvisitor; / ** * args * * @Autor * * * / CLASSE PUBLIQUE {/ ** * @Ars * @Autor * * public static void main (String [] args) {// Company CEO Staff Boss = new Manager ("1", "Big Boss", "PDG", 100000); / ** * Le PDG a plusieurs directeurs de département * / // Finance Department Manager Staff FinanMemanager = New Manager ("11", "Président Zhang", "Finance Manager", 60000); // Département des ressources humaines Manager du personnel du personnel du personnel = nouveau manager ("12", "président Wang", "Président directeur", 60000); // Manager du département technique TechnicalManager = New Manager ("13", "Président Chen", "Technical Department Manager", 60000); / ** * Il y a aussi des assistants et plusieurs superviseurs dans le département technique * / // Département technique Assistant Staff Deptassistant = New Manager ("1301", "Assistant Wang", "Department Assistant", 20000); // Directeur du département technique1 Staff DeptManager1 = New Manager ("1302", "Supervisor1", "Directeur technique", 30000); / ** * Directeur technique DeptManager1 Il existe également des ingénieurs logiciels (la personne qui finit par travailler) * / Staff Softwarengineer1 = New Employees ("1302001", "Zhang San", "Software Engineer", 5000); Staff Softwarengineer2 = Nouveaux employés ("1302002", "li si", "ingénieur logiciel", 5500); Staff Softwarengineer3 = New Employees ("1302003", "Wang Wu", "Software Engineer", 4500); // Ajouter des informations sur les employés pour le superviseur technique 1 DeptManager1.Add (SoftwareEngineer1); DeptManager1.Add (SoftwareEngineer2); DeptManager1.Add (SoftwareEngineer3); // Directeur du département technique 2 Staff DeptManager2 = New Manager ("1303", "SuperVisor2", "Directeur technique", 30000); // Ajouter: Assistant département, directeur technique 1 et directeur technique 2 TechnicalManager.Add (Deptassistant); TechnicalManager.Add (DeptManager1); TechnicalManager.Add (DeptManager2); // Marketing Manager Staff MarketingManager = New Manager ("14", "M. Wu", "Market Manager", 60000); // Ajouter au PDG: directeur du département des finances, directeur du département des ressources humaines, directeur du département technique et directeur marketing Boss.ADD (FinancEManager); BOSS.ADD (PersonnelManager); boss.add (TechnicalManager); boss.add (marketingmanager); // Imprimer les informations du PDG // boss.printiserBaseInfo (); // Imprimez l'information des employés du PDG Boss.ACcept (New PrintBaseInfoSitor ()); / ** * Statistiques Salaire des employés * / // Créer un salaire de l'employé statistique SalaryVisitor Visitor = new SalaryVisitor (); // Laissez le grand patron accepter le boss du visiteur.accept (visiteur); // Manager Statistics STATISTICS Visitor.printManagertotalsalary (); // Statistiques de salaire des employés généraux Visitor.PRINTEMPLOYEESTOTALALARY (); // Tous les statistiques salariales des employés Visitor.printtotalsalary (); }}4 Résultats en cours d'exécution
- Gestionnaire: - | 1 CDG de Big Boss 100000.0
- Gestionnaire: - | 11 General Zhang Finance Department Manager 60000.0
- Gestionnaire: - | 12 General Wang Resources Human Department Manager 60000.0
- Gestionnaire: - | 13 General Chen Technical Department Manager 60000.0
- Gestionnaire: - | 1301 Assistant Wang Department Assistant 20000.0
- Gestionnaire: - | 1302 Superviseur 1 Superviseur technique 30000.0
- Employés généraux: - | 1302001 Ingénieur logiciel Zhang SAN 5000.0
- Employés généraux: - | 1302002 LI SI INGÉNIEUR SOFICIEL 5500.0
- Employés généraux: - | 1302003 Ingénieur logiciel Wang Wu 4500.0
- Gestionnaire: - | 1303 Superviseur 2 Superviseur technique 30000.0
- Gestionnaire: - | 14 Directeur général WU Département marketing 60000.0
Salaire total du gestionnaire: 420 000.0
Salaire total des employés généraux: 15000.0
Salaire total des employés: 435 000.0
Iii. Les principes de conception de ce modèle
1 principe "de clôture ouverte"
2 principe de responsabilité unique
4. Utiliser des occasions
1 Si vous incluez de nombreux types d'objets différents dans une structure d'objets, ils ont des interfaces différentes et vous souhaitez implémenter certaines opérations qui dépendent de classes spécifiques sur ces différents objets.
2 Vous devez effectuer de nombreuses opérations différentes et sans rapport sur des objets dans une structure d'objets, et vous souhaitez éviter de relier ces opérations aux classes de ces objets. Le mode visiteur permet aux opérations connexes d'être centralisées et définies séparément dans une classe.
3 Lorsque cette structure d'objet est partagée par de nombreuses applications, utilisez le mode visiteur pour permettre à chaque application de contenir uniquement les opérations qui doivent être utilisées.
4 Les classes qui définissent la structure des objets changent rarement, mais de nouvelles opérations sont souvent nécessaires pour définir dans cette structure.
5. Diagramme de classe statique du mode visiteur
Pour plus de contenu lié à Java, les lecteurs qui sont intéressés par ce site peuvent afficher les sujets: "Tutoriel de structure de données Java et d'algorithme", "Résumé des conseils de nœud de Dom Operation Java", "Résumé du fichier Java et des conseils d'opération de répertoire" et "Résumé des conseils d'opération Java Cache"
J'espère que cet article sera utile à la programmation Java de tous.