Galeria de mapas mentais Padrão de design
Este é um mapa mental sobre os padrões de design, os principais conteúdos incluem: modo adaptador, modo de delegação, modo de política, modo de modelo, modo de protótipo (modo de criação), classificação do modo de design, modo de agente fornece um agente para outros objetos para controlar o acesso a esse objeto, o modo singleton, o modo de fábrica e os princípios de design.
Editado em 2025-02-23 19:08:11Este modelo mostra a estrutura e a função do sistema reprodutivo na forma de um mapa mental. Ele apresenta os vários componentes dos órgãos genitais internos e externos e classifica o conhecimento claramente para ajudá -lo a se familiarizar com os principais pontos do conhecimento.
Este é um mapa mental sobre a interpretação e o resumo do e-book do campo de relacionamento, conteúdo principal: visão geral da interpretação da essência e visão geral do e-book do campo de relacionamento. "Campo de relacionamento" refere -se à complexa rede interpessoal na qual um indivíduo influencia outras pessoas através de comportamentos e atitudes específicos.
Este é um mapa mental sobre livros contábeis e registros contábeis.
Este modelo mostra a estrutura e a função do sistema reprodutivo na forma de um mapa mental. Ele apresenta os vários componentes dos órgãos genitais internos e externos e classifica o conhecimento claramente para ajudá -lo a se familiarizar com os principais pontos do conhecimento.
Este é um mapa mental sobre a interpretação e o resumo do e-book do campo de relacionamento, conteúdo principal: visão geral da interpretação da essência e visão geral do e-book do campo de relacionamento. "Campo de relacionamento" refere -se à complexa rede interpessoal na qual um indivíduo influencia outras pessoas através de comportamentos e atitudes específicos.
Este é um mapa mental sobre livros contábeis e registros contábeis.
Padrão de design
Princípios de design
SÓLIDO
Único responsabilidade
Uma aula deve ter apenas um motivo para a mudança, caso contrário, a classe deve ser dividida
Princípio de abertura e fechamento
Aberto a extensões, perto de modificações
Princípio de substituição de Lisch
As subclasses podem estender as funções da classe pai, mas não podem alterar as funções originais da classe pai.
Princípio de isolamento da interface
A divisão da interface é menor e mais dedicada
Princípio da inversão de confiança
Ao projetar estruturas de código, módulos de alto nível não devem depender de baixo Os módulos de camada, ambos devem confiar na abstração, a abstração não deve depender de detalhes, os detalhes devem A dependência é abstrata.
Beijar princípios
Mantenha -o simples e estúpido
Princípios de Yagni
Não designe demais
Princípio seco
Não escreva código duplicado
Lei de Dimit
O tema principal é que um objeto deve manter o menor entendimento de outros objetos.
Classificação de padrões de design
Tipo de criação: 5 tipos de processo de criação de objetos
Modo de método de fábrica
Padrão de fábrica abstrato
Modo singleton
Modo construtor
Modo de protótipo
Tipo estrutural: Classes de processamento ou combinações de objetos, 7 tipos
Modo adaptador
Modo decorador
Modo de agente
Modo de aparência
Modo de ponte
Modo de combinação
Aproveite o modo Yuan
Tipo de comportamento: descreve como as classes ou objetos interagem e como atribuir responsabilidades, 11 tipos
Modo de política
Padrão de método de modelo
Modo de observador
Modo de iterador
Modelo de cadeia de responsabilidade
Modo de comando
Modo de memorando
Modo de status
Modo de visitante
Modelo intermediário
Modo de intérprete
Modelo de fábrica
Modo de fábrica simples
Modo de método de fábrica
Padrão de fábrica abstrato
Modo singleton
Estilo faminto: crie a inicialização do objeto ao carregar
Estilo preguiçoso: crie uma instância de objeto ao ligar
Classe interna estática: crie instâncias de objetos na classe interna
Singletons enumerados: segura por threads, carregados apenas uma vez, as classes enumeradas são todas as classes singleton. O único padrão de singleton que não será destruído agora (resolve a quebra de reflexão e serialização ruim)
A reflexão destrói Singleton: Embora o construtor esteja definido como privado, ele pode ser acessado com força de definição Para chamar seu construtor, Solução: faça uma exceção no construtor privado e proíba a criação de reflexão.
A serialização destrói Singleton: O objeto desapego será re-alocado a memória, ou seja, recriar.
Estojo único no estilo de contêiner
O modo proxy fornece um proxy para outros objetos controlarem o acesso a esse objeto.
Análise de proxy estática:
Adicione alguma funcionalidade extra sem modificar a classe de serviço original
deficiência: 1. O número de classes precisa ser aumentado 2. Não é flexível o suficiente 3. Alto custo de manutenção
Análise dinâmica de proxy
Método de implementação
Proxy dinâmico baseado em JDK
O processo geral é:
1. Crie um objeto de proxy dinâmico JDK e passe o objeto MemberServiceImpl como um parâmetro de destino.
2. Em seguida, chame o método getProxy, que chama proxy.newproxyInstance para carregar o objeto proxy deste MemberServiceImpl.
3. Chame o método de login através do objeto Proxy gerado, que não é o método do próprio MemberServiceImpl, mas é chamado para o método Invoke no InvocationHandler.
4. Aprimoramentos correspondentes podem ser feitos no método Invoke, onde o parâmetro do método é o método do objeto proxy, e args é o método do objeto de procuração
Código fonte JDK Análise de proxy dinâmico
Análise NewProxyInstance
(Verificação preliminar) Antes de criar um agente, alguma verificação básica será feita primeiro, como verificação de parâmetros vazios e inspeção de segurança.
1. Geração de objetos proxy) aqui getProxyclass0 é uma peça de lógica muito importante, que gerará o bytecode do objeto proxy e carregará o objeto Proxy na memória JVM.
2 Digite o método GetProxyclass para analisar. Se não existir, uma classe proxy será gerada e adicionada ao cache.
3. Em seguida, vá para o método proxyclasscache.get (carregador, interfaces) para analisá -lo. Esta etapa envolve principalmente fazer alguma verificação básica e você precisa obter o valor correspondente do mapa do cache, ou seja, o parâmetro valoresMap. Se não existir, precisamos inicializá -lo e inicializá -lo em um simplário vazio.
3. O código é reduzido. Em seguida, você precisa usar o método get () do fornecedor para criar o bytecode correspondente à classe proxy e carregar o bytecode na memória JVM.
4. Então, vamos dar uma olhada em como o método get () neste fornecedor é chamado. Aqui você pula para o método get () na fábrica. A lógica deste código é principalmente para criar valor, ou seja, para criar objetos proxy, mas a segurança do encadeamento também é necessária aqui.
5. Em seguida, observe o local onde o objeto proxy é realmente criado ValueFactory.Apply (Tecla, parâmetro), o que é feito através do ValueFactory. Primeiro de tudo, essa lógica é a lógica não essencial, que verifica aproximadamente a validade da matriz de interface e garante que a interface implementada na classe de proxy gerada seja válida.
6. A próxima lógica é determinar o nome do pacote e o nome da classe da classe proxy a ser gerada. A lógica é: se houver interfaces não públicas na interface recebida, a classe de proxy gerada estará no pacote onde essas interfaces não públicas residem. Se todas as interfaces forem interfaces públicas, a classe Proxy estará no pacote padrão com.sun.proxy. A classe Proxy padrão não é gerada no sistema de arquivos. Você pode configurar o parâmetro -dsun.misc.proxygenerator.saveGeneratedFiles = true nos parâmetros da VM quando o projeto é iniciado. Em seguida, o bytecode da classe proxy pode ser gerado no sistema de arquivos.
7. A próxima etapa é a lógica mais central, gerando bytecode e carregando -a na memória, para que a classe proxy possa ser usada através do objeto de classe no futuro. Este é o processo de geração de classes de proxy por meio de proxy dinâmico do JDK. Após a execução aqui é concluída, a classe <?> Cl = getProxyclass0 (carregador, intfs);
8. A próxima etapa é a última etapa, que criará a classe proxy em um objeto proxy. Esse objeto proxy implementa a interface especificada e delega a chamada do método para o InvocationHandler especificado.
Proxy dinâmico baseado no CGLIB.
O processo geral
1. Existe uma classe normal chamada LogInservice, que contém um método de login para executar operações de login.
2. Existe uma classe chamada cglibdynamicproxy que implementa a interface MethodInterceptor. O objetivo desta classe é criar um objeto de proxy dinâmico do CGLIB para executar métodos em vez de outros objetos.
3. No construtor da classe CGlibdynamicProxy, ele recebe um objeto de destino, indicando o objeto que você deseja proxy.
4. O método getProxy é usado para criar um objeto proxy. Ele usa a classe Enhancer do CGLIB, pega a classe do objeto de destino como a superclasse (classe pai) e define o objeto atual como um interceptador de método (isso representa o objeto atual). Em seguida, ele cria o objeto proxy usando o intensificador e o retorno.
5. No método de interceptação, quando o método do objeto proxy for chamado, ele primeiro produzirá uma linha de texto para indicar o início do proxy dinâmico do CGLIB e depois chamará o método correspondente do objeto de destino. Em seguida, ele produz uma linha de texto novamente para indicar o final do proxy dinâmico do CGLIB.
6. Na classe CGlibdynamict, criamos um objeto CglibdynamicProxy e passamos o objeto Loginservice para ele como o destino. Em seguida, usamos o método getProxy para obter o objeto Proxy e transformá -lo no tipo Loginservice.
7. Finalmente, usamos o objeto proxy para chamar o método de login. Cada vez que um método é chamado, o proxy produzirá texto antes e depois do método para indicar o início e o final do proxy dinâmico do CGLIB.
A diferença entre dois proxy dinâmicos
1. Diferentes métodos de implementação
O proxy dinâmico do JDK implementa todas as interfaces do objeto proxy através da reflexão, para que o JDK possa apenas proxy objetos que implementam objetos de interface;
O CGLLLIB reescreverá todos os métodos da classe Proxy, para que nem todos os métodos possam ser proxiados (privado e final não podem ser usados);
2. Maneiras diferentes de interceptar objetos de proxy
O proxy dinâmico do JDK é implementado implementando a interface InvocationHandler.
O proxy dinâmico do CGLIB usa subclasses da classe de destino, substitui os métodos de negócios e adiciona lógica cruzada para obter interceptação;
3. Desempenho e eficiência diferentes
O proxy dinâmico do JDK e o proxy CGLIB geram novos bytecode durante o tempo de execução, mas a implementação do CGLIB é mais complexa e usa a estrutura ASM.
O proxy dinâmico do JDK consulta as interfaces de todos os objetos de proxy por meio de mecanismos de reflexão, e o CGLIB proxy chama métodos diretamente através do mecanismo FastClass, de modo que a eficiência da execução é que o CGLIB é maior que o proxy JDK;
Prós e contras
vantagem
Ele pode separar o objeto proxy do objeto de destino real, reduzir o grau de acoplamento do sistema e é fácil de expandir.
falha
Aumentar a complexidade do sistema adicionará um objeto proxy entre o cliente e o objeto de destino, e a velocidade da solicitação diminuirá.
falha
O proxy do estado é implementado com base na reflexão.
Modo de protótipo (modo de criação)
Ideia central: com base em uma existente Copie um objeto para fora do objeto e reduza a criação direta do objeto através da cópia. custo.
Cópia profunda
Duas maneiras de implementar
Um é copiar o objeto recursivamente
O segundo tipo deve fazê -lo através da serialização do objeto.
Cópia rasa: apenas endereços de cópia: ambos os objetos dependem do mesmo objeto
Resumir:
A cópia rasa copiará apenas o tipo de dados básico dentro do objeto e o endereço de memória do objeto de referência e não copiará recursivamente. Objetos de referência e objetos de referência que referenciam objetos
E cópia profunda significa copiar completamente um novo objeto. Portanto, as operações profundas de cópia serão mais eficazes que a cópia superficial O desempenho é ainda pior. Ao mesmo tempo, o código de cópia raso é um pouco mais simples de escrever do que o código de cópia profundo.
Se o objeto que copiamos for imutável, ou seja, meu objeto só irá Verifique, ele não adicionará, excluirá e modificará e basta usar uma cópia rasa. Se houver adições, deleções e modificações de objetos, é necessário cópia profunda.
Em suma, deve ser detalhado adequadamente e depende da situação real do projeto.
Padrão de modelo
A estrutura para definir processos de processamento de negócios na classe pai e executar implementações específicas na subclasse
Modo de política
Defina uma interface principal e muitas classes implementam esta interface
Modo de delegação
É um orientado A função básica do padrão de design da imagem deve ser responsável pela chamada e alocação de tarefas; É um proxy estático especial, que pode ser entendido como um proxy de toda a direita (nota do modo agente Foco no processo, enquanto o modo de delegação se concentra nos resultados), o modo de delegação pertence a modelos comportamentais O estilo não pertence aos modos de design do GOF23;
Modo adaptador
A idéia principal é interface uma classe Converta em outra interface que os clientes desejam. Combine interfaces ou classes que de outra forma são incompatíveis e incompatíveis