Este artículo describe el uso del modo de visitante para resolver el problema del diagrama de la estructura jerárquica de la compañía. Compártelo para su referencia, como sigue:
1. Definición de patrones
Modo de visitante: representa una operación que actúa en cada elemento en una estructura de objeto. Permite al usuario definir nuevas operaciones que actúen sobre estos elementos sin cambiar la clase de cada elemento.
2. Ejemplos de modelo
1 análisis de patrones
Pedimos prestada la jerarquía de la compañía para ilustrar este modelo.
2 Modo de visitante Diagrama de clase estática
3 ejemplos de código
3.1 personal abstracto
paquete com.demo.structure; import com.demo.visitor.ivisitor;/** * Clase de empleados abstracto * * @author * */public abstract class Staff {// Número de empleado Cadena protegida no; // Nombre de la cadena protegida del empleado; // Posición de posición de cadena protegida; // salario de flotador protegido salarial; // Longitud de propiedad privada Cadena de longitud privada int; // Construye el método personal público (no, no, nombre de cadena, posición de cadena, salario de flotación) {this.no = no; this.name = name; this.Position = Position; this.salary = salario; // Calcule la longitud de byte total this.length += (no == null || "" .equals (no.trim ()))? 0: No.getBytes (). Longitud; this.length += (name == null || "" .equals (name.trim ()))? 0: posición.getBytes (). Longitud; this.length += (posicion == null || "" .equals (posicion.trim ()))? 0: posición.getBytes (). Longitud; this.length += string.ValueOf (salario) .getBytes (). longitud; } // Obtener información básica del usuario public void printUserBaseInfo () {System.out.println ("-|" + this.no + "" + this.name + "" + this.position + "" + this.salary); } // Agregar información del empleado Public Abstract void add (personal del personal); // Eliminar empleado público abstracto Eliminar (cadena NO); // recibir objeto del visitante abstracto público void aceptar (visitante ivisitor); public String getNo () {return no; } public void setNo (string no) {this.no = no; } public String getName () {nombre de retorno; } public void setName (nombre de cadena) {this.name = name; } public String getPosition () {posición de retorno; } public void setPosition (posición de cadena) {this.position = posicion; } public float getSalary () {salario de retorno; } public void setSalary (salario de flotación) {this.salary = salary; }}3.2 Gerente
paquete com.demo.structure; import java.util.arrayList; import com.demo.visitor.ivisitor;/** * gerente (alguien con otros empleados bajo su comando) * * @author * */public class gerente extiende personal {// Información de almacenamiento sobre empleados Private Final ArrayList <Spert Staff> ArrayList = New ArrayList <Staff Staff> ();); // Construir método Public Manager (cadena NO, nombre de cadena, posición de cadena, salario de flotación) {super (no, nombre, posición, salario); } / *** Agregar un empleado* / @Override public void add (personal del personal) {this.arrayList.Add (personal); } / *** Eliminar información de los empleados* / @Override Public Staff Eliminar (String NO) {Staff Staff = Null; if (no! = null &&! "". Equals (No.trim ())) {for (int i = 0; i <this.arrayList.size (); i ++) {if (this.arrayList.get (i) == null) {continuar; } if (No.equals (this.ArrayList.get (i) .getNo ())) {staff = this.ArrayList.Remove (i); romper; }}} Return Staff; } // Recibe objeto de visitante @Override public void aceptar (visitante ivisitor) {// Acceda a su propio visitante.visit (this); // atraviesa varios objetos de elementos en la lista de listas y recibe objeto visitante para (int i = 0; i <this.arrayList.size (); i ++) {if (this.ArrayList.get (i) == null) {continuar; } // recibir objeto del visitante this.arrayList.get (i) .accept (visitante); }}}3.3 empleados ordinarios
paquete com.demo.structure; import com.demo.visitor.ivisitor;/** * empleados ordinarios (personas reales funcionando) * * @author * */public class empleados extiende al personal {// Construye el método empleados públicos (no, no, nombre de cadena, posición de cadena, salario de flotación) {super (no, nombre, posición, salario); } / *** Agregar información del empleado* / @Override public void add (personal del personal) {return; } / *** Eliminar información del empleado* / @Override Public Staff Eliminar (String No) {// Devuelve NULL directamente a NULL; } // Recibe el objeto del visitante public void aceptar (visitante ivisitor) {visiter.visit (this); }}3.4 Interfaz de visitante
paquete com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/** * Interfaz de visitante * * @Author * */Public Interface Ivisitor {// Access Manager Public Void Visit (Manager Manager); // Acceda a empleados ordinarios Visita pública nula (empleados empleados);}3.5 Información básica de empleados Visitantes PrintBaseInfovistor
paquete com.demo.visitor; import com.demo.structure.Employees; import com.demo.structure.manager;/*** Imprima el visitante de información básica** @author**/public class printBaseInfoVisitor implementa ivisitor {/*** Objetivo de gerente de acceso*/Public void Visit (gerente gerente) {System.out.Print ("- Manager:" ");"); gerente.printuserBaseInfo (); } / *** Acceda al objeto del empleado ordinario* / public void visit (empleados empleados) {system.out.print ("- empleado general:"); empleados.printuserBaseInfo (); }}3.6 Cree una interfaz de visitante para indicar los salarios de los empleados - IsalaryVistor
paquete com.demo.visitor;/** * Calcule el visitante salarial * * @author * */public interfaz isalaryVisitor extiende ivisitor {// estadística gerente salarial public void printmanagertalario (); // Estadísticas General Empleado Salario Público Void PrintEmployeStotalStary (); // Estadísticas Todos los empleados Salario Public Void PrintTotalStary ();}3.7 Estadísticas del salario de los empleados y visitantes para realizar un salario
paquete com.demo.visitor; import com.demo.structure.employees; import com.demo.structure.manager;/** * Implementación específica de calculación de visitantes salariales * @author * */salarial de clase pública implementos isalaryVisitor {// total gerente de salario privado float managersalario; // Salario total de empleados ordinarios flotante privado empleadosalario; público salaryVisitor () {ManagersAlary = 0; EmpleeSalary = 0; } // Access Manager Public void Visit (Gerente Manager) {ManagerSalary += Manager.getSalary (); } // Visita a los empleados comunes Visita pública nula (empleados empleados) {EmpleeSalario += Empleados.getSalary (); } // Estadística El salario de los empleados generales públicos void printEmployeStotalTalyary () {System.out.println ("Suma salarial general del empleado:" + EmployeSsalary); } // Estadística El salario de los gerentes public void printmanagertotaltary () {System.out.println ("Sume de gerente:" + ManagersAlary); } // Estadísticas de todos los salarios de todos los empleados public void printTotalStary () {System.out.println ("Salario del empleador:" + (gerente + empleoSeSsalary)); }}3.8 Prueba de cliente a un cliente
paquete com.demo; import com.demo.structure.employee; import com.demo.structure.manager; import com.demo.structure.staff; import */ public static void main (string [] args) {// Company CEO Staff Boss = New Manager ("1", "Big Boss", "CEO", 100000); / *** El CEO tiene varios gerentes del departamento*/ // Financier del Gerente del Departamento Financero = nuevo gerente ("11", "Presidente Zhang", "Gerente de finanzas", 60000); // Gerente del Departamento de Recursos Humanos Personal personal de personal = nuevo gerente ("12", "Presidente Wang", "Presidente Gerente", 60000); // Gerente del Departamento Técnico del personal técnico técnico = nuevo gerente ("13", "Presidente Chen", "Gerente del Departamento Técnico", 60000); / *** También hay asistentes y varios supervisores en el departamento técnico*/ // Asistente del departamento técnico Staff Stafsistant = New Manager ("1301", "Asistente Wang", "Asistente de departamento", 20000); // Director de Departamento Técnico1 Staff DeptManager1 = nuevo gerente ("1302", "Supervisor1", "Director técnico", 30000); / ** * Director Técnico DeptManager1 Hay ingenieros de software (la persona que termina trabajando) */ Staff Software Engineer1 = nuevos empleados ("1302001", "Zhang San", "Ingeniero de software", 5000); Software Software Engineer2 = nuevos empleados ("1302002", "Li Si", "Ingeniero de software", 5500); Software Software Engineer3 = nuevos empleados ("1302003", "Wang Wu", "Ingeniero de software", 4500); // Agregar información de los empleados para el supervisor técnico 1 DeptManager1.Add (Software Engineer1); DeptManager1.Add (Software Engineer2); DeptManager1.Add (Software Engineer3); // Director del Departamento Técnico 2 Personal DeptManager2 = nuevo gerente ("1303", "Supervisor2", "Director técnico", 30000); // Agregar: Asistente de departamento, Director Técnico 1 y Director Técnico 2 TechnicalManager. TechnicalManager.Add (DeptManager1); TechnicalManager.Add (DeptManager2); // Gerente de marketing personal MarketingManager = nuevo gerente ("14", "Sr. Wu", "Gerente de mercado", 60000); // Agregar al CEO: Gerente del Departamento de Finanzas, Gerente del Departamento de Recursos Humanos, Gerente de Departamento de Técnico y Gerente de Marketing Boss.Add (Financemanger); boss.add (personal de personal); Boss.Add (TechnicalManager); Boss.Add (MarketingManager); // Imprimir información del CEO // boss.printuserBaseInfo (); // Imprima la información del empleado del CEO. / *** Estadísticas Salario del empleado*/ // Cree un visitante de visitante salarial del empleado de estadísticas Visitante Visitor = new SalaryVisitor (); // deja que el gran jefe acepte el jefe de visitante. Accept (visitante); // Visitante de estadísticas salariales del gerente. // Estadísticas de salario de empleados generales visitante. PrintMloyeStotalSalary (); // Todos los visitantes de estadísticas salariales de los empleados. PrintTotalSalary (); }}4 Resultados de ejecución
- Gerente: - | 1 Big Boss CEO 100000.0
- Gerente: - | 11 Gerente del Departamento de Finanzas General de Zhang 60000.0
- Gerente: - | 12 Gerente General de Departamento de Recursos Humanos de Wang 60000.0
- Gerente: - | 13 Gerente General de Departamento Técnico de Chen 60000.0
- Gerente: - | 1301 Asistente del departamento de Wang Asistente 20000.0
- Gerente: - | 1302 Supervisor 1 Supervisor técnico 30000.0
- Empleados generales: - | 1302001 Zhang SAN Ingeniero de software 5000.0
- Empleados generales: - | 1302002 Li SI Ingeniero de software 5500.0
- Empleados generales: - | 1302003 Wang Wu Software Engineer 4500.0
- Gerente: - | 1303 Supervisor 2 Supervisor técnico 30000.0
- Gerente: - | 14 Gerente General WU Marketing Departamento 60000.0
Salario total del gerente: 420,000.0
Salario total de empleados generales: 15000.0
Salario total de empleados: 435,000.0
Iii. Los principios de diseño de este patrón
Principio de 1 "cierre abierto"
2 Principio de responsabilidad única
4. Use ocasiones
1 Si incluye muchos tipos diferentes de objetos en una estructura de objetos, tienen diferentes interfaces y desea implementar algunas operaciones que dependan de clases específicas de estos diferentes objetos.
2 Debe realizar muchas operaciones diferentes y no relacionadas con objetos en una estructura de objetos, y desea evitar relacionar estas operaciones con las clases de estos objetos. El modo de visitante permite que las operaciones relacionadas se centralicen y definan por separado en una clase.
3 Cuando esta estructura de objeto es compartida por muchas aplicaciones, use el modo de visitante para permitir que cada aplicación contenga solo las operaciones que deben usarse.
4 Las clases que definen la estructura del objeto rara vez cambian, pero a menudo se requieren nuevas operaciones para definir en esta estructura.
5. Modo de visitante Diagrama de clase estática
Para obtener más contenido relacionado con Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos de Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación Java DOM", "Resumen de los archivos Java y consejos de operación de directorio" y "Summary of Java Cache Operation Tips" ".
Espero que este artículo sea útil para la programación Java de todos.