Este exemplo descreve o uso do modo de combinação para implementar a função de representar a estrutura organizacional de uma empresa. Compartilhe -o para sua referência, como segue:
1. Definição do padrão
Modo de combinação: combinando objetos em uma estrutura de árvore para representar uma hierarquia "parcialmente inteira". O modo de combinação torna os usuários consistentes com o uso de objetos individuais e objetos combinados.
2. Exemplos de modos de combinação
1 Análise de padrão
Emprestamos o gráfico organizacional da empresa para ilustrar esse modelo.
Após a análise, obtemos o diagrama de classes estáticas desse padrão da seguinte maneira:
2 exemplos de código
2.1 Estabelecer classes abstratas dos funcionários
pacote com.demo.composite;/** * interface da classe de funcionários * * @author * */public abstration staff {// Número do funcionário String protegida no; // Nome do funcionário Nome da sequência protegida; // Posição da posição da sequência protegida; // salário de flutuação protegido pelo salário; // Comprimento de propriedade privada String private int comprimento; // Método de construção da equipe pública (string não, nome da string, posição da string, salário de flutuação) {this.no = não; this.name = nome; this.Position = posição; this.salary = salário; // Calcule o comprimento total do byte this.length += (NO == null || "" .Equals (No.Trim ()))? 0: Não .GetBytes (). Comprimento; this.Length += (nome == null || "" .equals (name.trim ()))? 0: nome .getBytes (). Comprimento; this.Length += (Position == NULL || "" .Equals (POSICE.Trim ()))? 0: POSITION.GETBYTES (). Length; this.Length += String.ValueOf (salário) .GetBytes (). Comprimento; } // Obtenha informações básicas do usuário public void PrintUserBaseInfo () {System.out.println ("|" + this.no + "" "this.name +" " + this.Position +" " + this.Salary); } // Adicionar informações sobre o funcionário Resumo public void add (equipe da equipe); // Excluir a equipe de abstrato público do funcionário Remover (string não); // Imprime Informações dos funcionários Public Resumo Void PrintemployeeesInfo (Int Camada); // imprima vários caracteres Protected void printchar (int camada) {for (int j = 0; j <camada * 2; j ++) {System.out.print ("-"); }} // Método privado imprime uma linha Protid Printline Protected () {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 = não; } public string getName () {return name; } public void setName (nome da string) {this.name = name; } public string getPosition () {retorna posição; } public void setPosition (posição da string) {this.Position = Position; } public float getSalary () {return salary; } public void Setsalary (salário de flutuação) {this.salary = salário; }}2.2 Crie um gerente
pacote com.demo.composposite.sub; importar java.util.arraylist; importar com.demo.composite.staff;/** * gerente (alguém com outros funcionários sob seu comando) * * @author * */public classe Manager estende a equipe {// armazenam informações sobre os funcionários. // Método de construção gerente público (string no, nome da string, posição da string, salário de flutuação) {super (não, nome, posição, salário); } / *** Adicione um funcionário* / @Override public void Add (Staff Staff) {this.arraylist.add (Staff); } / *** Exclua informações do funcionário* / @Override Public Staff Remover (string não) {Staff Staff = null; if (não! = null &&! "". Equals (No.Trim ())) {for (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {continuação; } if (No.equals (this.arrayList.get (i) .getno ())) {staff = this.arraylist.remove (i); quebrar; }}} retornar equipe; } / *** Imprimir informações do funcionário* / @Override public void PrintemployeeesInfo (int layer) {int tmPlayer = ++ camada; for (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {continuação; } // print '-' printchar (tmplayer); // imprima informações básicas dos funcionários this.arraylist.get (i) .printuserBaseInfo (); // Imprime as informações dos funcionários em seu post }}}2.3 Crie funcionários comuns
pacote com.demo.composite.sub; importar com.demo.composposta.staff;/** * funcionários comuns (realmente funcionando) * * @author * */public classe funcionários estende a equipe {// Construa método público funcionários (string no, nome da string, posição da string, salário de flutuação) {super (não, nome, posição, salário); } / *** Adicione informações do funcionário* / @Override public void Add (Staff Staff) {return; } / *** Exclua informações do funcionário* / @Override Public Staff Remover (string não) {// retorna null retornar diretamente NULL; } / *** Imprimir informações do funcionário* / @Override public void PrintemployeeesInfo (int layer) {return; }}2.4 Teste de cliente
pacote com.demo; importar com.demo.composite.staff; importar com.demo.composite.sub.employes; importar com.demo.compose.sub.manager;/** * aplicativo principal * * @author * */public class Client {** ** @param args */public static Void Main ([] Chefe "," CEO ", 100000); / *** O CEO possui vários gerentes de departamento*/ // Gerente de departamento financeiro Financemanager = New Manager ("11", "Presidente Zhang", "Gerente do Departamento Financeiro", 60000); // Gerente de pessoal da equipe = novo gerente ("12", "Presidente Wang", "Presidente Gerente", 60000); // Staff TechnicalManager = New Manager ("13", "Presidente Chen", "Gerente de Departamento Técnico", 60000); / *** Existem também assistentes e vários supervisores no departamento técnico*/ // Departamento de Staff = New Manager ("1301", "Assistant Wang", "Department Assistant", 20000); // Gerente de Departamento Técnico1 Staff DeptManager1 = New Manager ("1302", "Supervisor1", "Supervisor Técnico", 30000); / ** * Supervisor técnico DeptManager1 Existem engenheiros de software (a pessoa que trabalha no final) */ Staff SoftwareEngineer1 = New Funcionários ("1302001", "Zhang San", "Engenheiro de Software", 5000); SofterEngineer2 = novos funcionários ("1302002", "Li si", "Software Engineer", 5500); SofterEngineer3 = novos funcionários ("1302003", "Wang Wu", "Engenheiro de Software", 4500); // Adicionar informações de funcionários para o Diretor Técnico 1 DeptManager1.add (SoftwareEngineer1); Deptmanager1.add (SoftwareEngineer2); Deptmanager1.add (SoftwareEngineer3); // Diretor do Departamento Técnico 2 Departamento de Staff de DeptManager2 = New Manager ("1303", "Supervisor2", "Technical Director", 30000); // Adicionar ao gerente do departamento técnico: Assistente de departamento, Diretor Técnico 1 e Diretor Técnico 2 Técnico Manager.Add (Deptassistant); TechnicalManager.Add (DeptManager1); TechnicalManager.Add (DeptManager2); // Gerente de marketing Staff MarketingManager = New Manager ("14", "Sr. Wu", "Gerente de Mercado", 60000); // Adicionar ao CEO: Gerente do Departamento de Finanças, Gerente do Departamento de Recursos Humanos, Gerente de Departamento Técnico e Gerente de Marketing Boss.Add (Fina FinancieMer); Boss.Add (PessoalManager); Boss.Add (TechnicalManager); Boss.Add (MarketingManager); // Print CEO Information Boss.printuserBaseInfo (); // Print CEO Funcionário Informações Boss.printemployeesInfo (1); }}Os resultados da operação são os seguintes:
| 1 Big Boss CEO 100000.0
--- | 11 General Zhang Finance Department Manager 60000.0
--- | 12 General Wang Recursos Humanos Departamento de Recursos 60000.0
--- | 13 General Chen Technical Department Manager 60000.0
------ | 1301 Assistente Assistente de Departamento de Wang 20000.0
----- | 1302 Supervisor 1 Supervisor Técnico 30000.0
------- | 1302001 Zhang San Engenheiro de software 5000.0
------- | 1302002 Li Si Software Engineer 5500.0
------- | 1302003 Wang Wu Engenheiro de software 4500.0
------ | 1303 Supervisor 2 Supervisor Técnico 30000.0
--- | 14 Gerente Geral de Departamento de Marketing 60000.0
3. Os princípios de design deste modelo
1 Trate objetos individuais e combinados uniformemente
2 programação abstrata orientada
4. Use ocasiões
1 Quando você deseja representar a hierarquia "parcial e inteira" do objeto.
2 Quando o usuário deseja ignorar a diferença entre um objeto combinado e um único objeto, o usuário usará todos os objetos na estrutura combinada uniformemente.
O diagrama de classe estática do modo de combinação é o seguinte
Para obter mais informações sobre os algoritmos Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo das dicas de nó da operação Java Dom", "Resumo de dicas de operação de Java e Operação de Java" e "Resumo de Java cache" Tips "TIPS"
Espero que este artigo seja útil para a programação Java de todos.