Este ejemplo describe el uso del modo de combinación para implementar la función de representar la estructura organizacional de una empresa. Compártelo para su referencia, como sigue:
1. Definición de patrones
Modo combinación: combinar objetos en una estructura de árbol para representar una jerarquía "parcialmente completa". El modo combinado hace que los usuarios sean consistentes con el uso de objetos individuales y objetos combinados.
2. Ejemplos de modos de combinación
1 análisis de patrones
Tomamos prestado la tabla organizacional de la compañía para ilustrar este modelo.
Después del análisis, obtenemos el diagrama de clase estática de este patrón de la siguiente manera:
2 ejemplos de código
2.1 Establecer clases de abstracto de empleados
paquete com.demo.composite;/** * Interfaz de clase de empleado * * @author * */personal de clase pública de resumen {// 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: nombre .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 de 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); // Imprimir información de los empleados abstracto público void printEmployeSinfo (int Layer); // Imprima varios caracteres protegidos void printHar (int layer) {for (int j = 0; j <layer * 2; j ++) {system.out.print ("-"); }} // El método privado imprime una línea protegida void printline () {system.out.print ("+"); for (int i = 0; i <this.length+4; i ++) {System.out.print ("-"); } System.out.println ("-"); } 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; }}2.2 Crear un gerente
paquete com.demo.composite.sub; import java.util.arraylist; import com.demo.composite.staff;/** * gerente (alguien con otros empleados bajo su comando) * * @author * */public class Manager extiende al personal {// Información de almacenamiento sobre empleados finales privados ArrayList <Staft Staff> ArrayList = New ArostList <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; } / *** Imprimir información de los empleados* / @Override public void PrintMloyeSInfo (int Layer) {int tmplayer = ++ capa; for (int i = 0; i <this.ArrayList.Size (); i ++) {if (this.ArrayList.get (i) == null) {continuar; } // imprimir '-' printHar (tmplayer); // Imprime información básica del empleado this.ArrayList.get (i) .PrintuserBaseInfo (); // Imprimir información de los empleados en su publicación this.ArrayList.get (i) .PrintEmployeSInfo (tmplayer); }}}2.3 Crear empleados ordinarios
paquete com.demo.composite.sub; import com.demo.composite.staff;/** * empleados ordinarios (realmente funcionando) * * @author * */public class empleados extiende al personal {// Construye el método empleados públicos (no, no, nombre de cadena, posición de cadena, float salary) {super, 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 nulo Dirección directa NULL; } / *** Imprimir información de los empleados* / @Override public void PrintMloyeSInfo (int Layer) {return; }}2.4 Pruebas de clientes
paquete com.demo; import com.demo.composite.staff; import com.demo.composite.sub.employeee; import com.demo.composite.sub.manager;/** * aplicación principal * * @author * */public class Client {/** * @param args */public estatic boid main (] argumentos) {// CEA de la compañía CEAT. Jefe "," CEO ", 100000); / *** El CEO tiene varios gerentes del departamento*/ // Financier del Gerente del Departamento del Departamento Financero = nuevo gerente ("11", "Presidente Zhang", "Gerente del Departamento Financiero", 60000); // Gerente de personal de personal = nuevo gerente ("12", "Presidente Wang", "Presidente Gerente", 60000); // 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*/ // Staff DePTassistant = nuevo gerente ("1301", "Asistente Wang", "Asistente de departamento", 20000); // Gerente de Departamento Técnico1 Staff DeptManager1 = nuevo gerente ("1302", "Supervisor1", "Supervisor técnico", 30000); / ** * Supervisor técnico DeptManager1 Hay ingenieros de software (la persona que trabaja al final) */ Staff SoftwareEngineer1 = 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 empleados para el director 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 al gerente del departamento técnico: Asistente de departamento, Director Técnico 1 y Director Técnico 2 TechnicalManager.Add (DePTassistant); 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 BOSS.PrintEmployeSInfo (1); }}Los resultados de la operación son los siguientes:
| 1 Big Boss CEO 100000.0
--- | 11 Gerente del Departamento de Finanzas General de Zhang 60000.0
--- | 12 Gerente de Departamento de Recursos Humanos Generales Wang 60000.0
--- | 13 Gerente de Departamento Técnico General de Chen 60000.0
------ | 1301 Asistente del departamento de Wang Asistente 20000.0
----- | 1302 Supervisor 1 Supervisor técnico 30000.0
------- | 1302001 Zhang San Ingeniero de Software 5000.0
------- | 1302002 Li SI Ingeniero de software 5500.0
------- | 1302003 Wang Wu Software Engineer 4500.0
------ | 1303 Supervisor 2 Supervisor técnico 30000.0
--- | 14 Gerente General de Departamento de Marketing WU 60000.0
3. Los principios de diseño de este modelo
1 Tratar objetos individuales y combinados de manera uniforme
2 programación orientada a resumen
4. Use ocasiones
1 Cuando desea representar la jerarquía "parcial y completa" del objeto.
2 Cuando el usuario desea ignorar la diferencia entre un objeto combinado y un solo objeto, el usuario usará todos los objetos en la estructura combinada de manera uniforme.
El diagrama de clase estática del modo combinación es el siguiente
Para obtener más información sobre los algoritmos de Java, los lectores interesados en este sitio pueden ver los temas: "Estructura de datos Java y tutorial de algoritmo", "Resumen de las puntas de nodo de operación de Java DOM", "Resumen de Java Archivo y TIPS de operación de directorio" y "Summary of Java Cache Operation Tips" TIPS ""
Espero que este artículo sea útil para la programación Java de todos.