Este artigo descreve o uso do modo de visitante para resolver o problema do diagrama de estrutura hierárquica da empresa. Compartilhe -o para sua referência, como segue:
1. Definição do padrão
Modo do visitante: representa uma operação que atua em cada elemento em uma estrutura de objeto. Ele permite ao usuário definir novas operações que atuam sobre esses elementos sem alterar a classe de cada elemento.
2. Exemplos de modelo
1 Análise de padrão
Emprestamos a hierarquia da empresa para ilustrar esse modelo.
2 diagrama de classe estática no modo visitante
3 exemplos de código
3.1 Pessoal abstrato
pacote com.demo.structure; importar com.demo.visitor.ivisitor;/** * Classe de funcionário abstrata * * @author * */public abstract class 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: POSITION.GETBYTES (). Length; 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); // Receba objeto de visitante Public Resumo Void Aceitar (Visitante IVISISTER); public string getNo () {return não; } 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; }}3.2 Gerente
pacote com.demo.structure; importar java.util.ArrayList; importar com.demo.visitor.ivisitor;/** * gerente (alguém com outros funcionários sob seu comando) * * @author * */public classe Manager estende a equipe {// Store Information Information Soldents Final Arraylist <ffice> // 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; } // Receba objeto de visitante @Override public void aceit (visitante ivisitor) {// Access seu próprio visitante.visit (this); // Travessia vários objetos de elemento na lista de listas e recebem objeto de visitante para (int i = 0; i <this.arraylist.size (); i ++) {if (this.arraylist.get (i) == null) {continua; } // Receba objeto de visitante this.arraylist.get (i) .Acept (visitante); }}}3.3 Funcionários comuns
pacote com.demo.structure; importar com.demo.visitor.ivisitor;/** * funcionários comuns (pessoas reais que trabalham) * * @author * */public class Funcionários estende a equipe {// Construa método funcionários públicos (string n. } / *** 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 nulo diretamente para null; } // recebe o objeto visitante public void aceit (visitante ivisitor) {visitante.Visit (this); }}3.4 Interface do visitante-IVISITOR
pacote com.demo.visitor; importar com.demo.structure.employes; importar com.demo.structure.manager;/** * interface do visitante * * @author * */interface pública IVISITIDE {// Access Manager public void visit (gerente); // Access funcionários ordinários Visita pública de vazio (funcionários);}3.5 Informações básicas dos funcionários Visitantes PrintBaseInfovistor
pacote com.demo.visitor; importar com.demo.structure.employes; importar com.demo.structure.manager;/*** imprima visitante de informações básicas** @author**/public class PrintBaseInFovisitor implementa o ivisitor {/** *** gerente.printuserBaseInfo (); } / *** Acesse objeto de funcionário ordinário* / public void visit (funcionários) {System.out.print ("- Empregado geral:"); funcionários.printuserBaseInfo (); }}3.6 Crie uma interface de visitante para declarar salários de funcionários - IsalaryVistor
pacote com.demo.visitor;/** * Calcule o visitante salarial * * @Author * */interface pública IsalaryVisitor estende o IVISITIMIZENTO {// Salário do gerente de estatísticas public void PrintManagerTaltalary (); // Estatística Salário geral do funcionário público Void Printemployeestotalsalário (); // estatísticas todos os funcionários salários public void printTotalSalary ();}3.7 Estatísticas do salário e visitantes de funcionários para realizar um salário
pacote com.demo.visitor; importar com.demo.structure.employes; importar com.demo.structure.manager;/** * Implementação específica do cálculo do visitante salarial * * @author * */public classe SalaryVisitor implementa isalaryVisitor {// Gerente total de gerenciamento privado gerenciador privado; // Salário total de funcionários comuns Float privado empregando; public SalaryVisitor () {GerenteSalary = 0; empregandoSalary = 0; } // Access Manager Public void visit (gerente) {gerentesalaria += gerente.getSalary (); } // Visite funcionários comuns Visita pública de void (funcionários) {Employeessalary += funcionários.getSalary (); } // Estatísticas O salário dos funcionários gerais public void printemployeestotalsalary () {System.out.println ("Soma do salário geral dos funcionários:" + Emprega); } // Estatísticas O salário dos gerentes public void printManagerTalsalary () {System.out.println ("Somente salarial do gerente:" + gerenciamento); } // Estatísticas dos salários de todos os funcionários public void printtotalsalário () {System.out.println ("Salário do Empregador:" + (Gerenciersalário + Emprego)); }}3.8 Teste de cliente um cliente
pacote com.demo; importar com.demo.structure.employes; importar com.demo.structure.manager; importar com.demo.structure.staff; import com.demo.visitor.printbaseInfovisitor; import com.demo.visitor.salaryVisitor;/** Application; */ public static void main (string [] args) {// CEO da empresa CEO Boss = new Manager ("1", "Big Boss", "CEO", 100000); / *** O CEO possui vários gerentes de departamento*/ // Gerente de Departamento de Finanças financiador de funcionários = novo gerente ("11", "Presidente Zhang", "Gerente de Finanças", 60000); // Gerente do Departamento de Recursos Humanos Pessoal Staffanager = New Manager ("12", "Presidente Wang", "Presidente Gerente", 60000); // Gerente de departamento técnico Staffanager 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 funcionários assistentes do departamento técnico Deptassista = New Manager ("1301", "Assistente Wang", "Departamento Assistente", 20000); // Diretor de Departamento Técnico 1 Staff DeptManager1 = New Manager ("1302", "Supervisor1", "Technical Director", 30000); / ** * Diretor técnico DeptManager1 Existem engenheiros de software (a pessoa que acaba trabalhando) */ 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); // Adicione informações dos funcionários para o supervisor 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); // Add: Assistente de departamento, Diretor Técnico 1 e Diretor Técnico 2 TechnicalManager.Add (Deptasseltante); 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 (); // imprima o chefe de informações do funcionário do CEO. / *** Salário do funcionário de estatísticas*/ // Crie um visitante salarial do funcionário de estatísticas Visitante Visitante de SalaryVisitor = New SalaryVisitor (); // Deixe o Big Boss aceitar o chefe do visitante.Acept (visitante); // Gerente Statistics Salary Statistics Visitor.printmanagerTalsalary (); // Visitante de estatística salarial geral dos funcionários. // TODOS OS FUNCIONÁRIOS ESTATÍSTICAS SALÁRIAS Visitante.printtotalsalary (); }}4 resultados de execução
- Gerente: - | 1 Big Boss CEO 100000.0
- Gerente: - | 11 General Zhang Finance Department Manager 60000.0
- Gerente: - | 12 General Wang Recursos Humanos Gerente 60000.0
- Gerente: - | 13 General Chen Technical Manager 60000.0
- Gerente: - | 1301 Assistente Assistente de Departamento de Wang 20000.0
- Gerente: - | 1302 Supervisor 1 Supervisor Técnico 30000.0
- Funcionários gerais: - | 1302001 Zhang San Engenheiro de software 5000.0
- Funcionários gerais: - | 1302002 engenheiro de software Li Si 5500.0
- Funcionários gerais: - | 1302003 Engenheiro de software Wang Wu 4500.0
- Gerente: - | 1303 Supervisor 2 Supervisor Técnico 30000.0
- Gerente: - | 14 Gerente Geral WU Marketing Department 60000.0
Salário do gerente total: 420.000.0
Salário total de funcionários gerais: 15000.0
Salário total de funcionários: 435.000.0
Iii. Os princípios de design deste padrão
1 Princípio de "Close Open"
2 Princípio de responsabilidade única
4. Use ocasiões
1 Se você incluir muitos tipos diferentes de objetos em uma estrutura de objetos, eles têm interfaces diferentes e deseja implementar algumas operações que dependem de classes específicas desses objetos diferentes.
2 Você precisa executar muitas operações diferentes e não relacionadas em objetos em uma estrutura de objetos e deseja evitar relacionar essas operações com as classes desses objetos. O modo de visitante permite que as operações relacionadas sejam centralizadas e definidas separadamente em uma classe.
3 Quando essa estrutura de objeto for compartilhada por muitos aplicativos, use o modo de visitante para permitir que cada aplicativo contenha apenas as operações que precisam ser usadas.
4 As classes que definem a estrutura do objeto raramente mudam, mas novas operações geralmente são necessárias para definir nessa estrutura.
5. Diagrama de classe estática no modo visitante
Para mais conteúdo relacionado ao Java, os leitores interessados neste site podem visualizar os tópicos: "Estrutura de dados Java e tutorial de algoritmo", "Resumo da operação Java Dom Node Tips", "Resumo de Dicas de Operação de Arquivos e Diretórios de Java" e "Resumo das dicas de operação do Java Cache"
Espero que este artigo seja útil para a programação Java de todos.