O modo Xiangyuan é diferente do modo de design geral. É usado principalmente para otimizar o desempenho do programa. É melhor resolver os problemas de desempenho causados por um grande número de objetos semelhantes. O padrão de enciclopédia reduz o número de objetos e, assim, melhora o desempenho do aplicativo analisando os objetos do aplicativo e analisando -os em dados intrínsecos e externos.
Conhecimento básico
O modo de enciclopédia reduz o número de objetos compartilhando um grande número de objetos de granulação fina, reduzindo assim a memória dos objetos e melhorando o desempenho dos aplicativos. A idéia básica é decompor a composição de objetos semelhantes existentes e expandi-los em dados internos compartilhados e dados externos não compartilhados. Chamamos o objeto dos dados internos de meta objeto. Geralmente, também é necessária uma classe de fábrica para manter dados intrínsecos.
No JS, o modo de enciclopédia consiste principalmente nos seguintes caracteres:
(1) Cliente: Uma classe usada para chamar a fábrica Xiangyuan para obter dados intrínsecos, geralmente o objeto exigido pelo aplicativo.
(2) Fábrica Xiangyuan: aula usada para manter dados Xiangyuan
(3) Aproveite a classe Yuan: uma aula que mantém dados internos
Implementação e aplicação do modo Xiangyuan
Implementação geral
Vamos dar um exemplo para ilustrar: os iPhones da Apple produzem. A maioria dos dados, como modelos e telas, é igual, e algumas partes dos dados como a memória são divididas em 16g, 32g, etc. Antes de usar o modo de enciclopédia, escrevemos o código da seguinte forma:
função iphone (modelo, tela, memória, sn) {this. modelo = modelo; this.screen = tela; this.Memory = Memory; this.sn = sn;} varphones = []; para (var i = 0; i <1000000; i ++) {var memória = i % 2 == 0? 16: 32; telefones.push (novo iPhone ("iPhone6s", 5.0, memória, i));}Nesse código, um milhão de iPhones são criados e cada iPhone se aplica a uma memória de forma independente. Mas quando olhamos de perto, podemos ver que a maioria dos iPhones é semelhante, exceto que a memória e os números de série são diferentes. Se for um programa com requisitos de alto desempenho, devemos considerá -lo otimizá -lo.
Para um grande número de programas com objetos semelhantes, podemos considerar o uso do modo Xiangyuan para otimizá -lo. Analisamos que a maioria dos modelos, telas e memória do iPhone é a mesma, para que essa parte dos dados possa ser usada para fins públicos, que são os dados internos no modo Xiangyuan. A definição da classe Xiangyuan é a seguinte:
função iphoneflyweight (modelo, tela, memória) {this.model = modelo; this.screen = tela; this.memory = memória;}Definimos a aula do iPhone, que contém três dados: modelo, tela e memória. Também precisamos de uma fábrica Xiangyuan para manter esses dados:
var flyweightFactory = (function () {var iPhones = {}; return {get: function (modelo, tela, memória) {var key = modelo + tela + memória; if (! iPhones [key]) {iPhones [key] =};Nesta fábrica, definimos um dicionário para salvar o objeto de sacrifício, fornecemos um método para obter o objeto de sacrifício de acordo com os parâmetros e, se houver um sacrifício, ele será devolvido diretamente e, se não houver sacrifício, será criado.
Em seguida, criamos uma classe cliente, que é modificada na classe do iPhone:
função iphone (modelo, tela, memória, sn) {this.flyweight = flyweightFactory.get (modelo, tela, memória); this.sn = sn;}Então ainda geramos vários iPhones como no meio
var telefones = []; para (var i = 0; i <1000000; i ++) {var memória = i % 2 == 0? 16: 32; telefones.push (novo iPhone ("iPhone6s", 5.0, memória, i));} console.log (telefones);A chave aqui é este.flyweight = flyweightfactory.get (modelo, tela, memória) no construtor do iPhone. Este código obtém dados Xiangyuan através da fábrica Xiangyuan. Na fábrica Xiangyuan, se um objeto com os mesmos dados já existir, ele retornará diretamente o objeto. Vários objetos do iPhone compartilham essa parte dos mesmos dados, de modo que os dados semelhantes originais foram bastante reduzidos, reduzindo o uso da memória.
Aplicação de aproveitar o modo Yuan em DOM
Uma aplicação típica do modo Xiangyuan é a operação de eventos DOM e o mecanismo de eventos DOM é dividido em bolhas de eventos e captura de eventos. Vamos apresentar brevemente esses dois:
Bolha do evento: o evento encadernado começa no elemento mais interno e depois borbulha até a camada mais externa
Captura de eventos: O evento ligado começa no elemento mais externo e depois passa para a camada mais interna.
Suponha que tenhamos uma lista de menus em html
<ul> <li> Opção 1 </li> <li> Opção 2 </li> <li> Opção 3 </li> <li> Opção 4 </li> <li> Opção 5 </li> <li> Opção 6 </li> </li>
Clique no item de menu para executar a operação correspondente. Ligamos eventos através do jQuery, o que geralmente faz:
$ (". Item"). on ("clique", function () {console.log ($ (this) .Text ());})Ligue os eventos para cada item da lista e clique para produzir o texto correspondente. Não há problema no momento, mas se for uma lista muito longa, especialmente se for um telefone celular com uma lista particularmente longa, haverá problemas de desempenho, porque cada item está vinculado a eventos e assume memória. Mas esses manipuladores de eventos são realmente muito semelhantes, por isso precisamos otimizá -los.
$ (". Menu").Dessa forma, o número de manipuladores de eventos pode ser reduzido. Este método é chamado de delegação de eventos, que também usa o princípio do modelo Xiangyuan. O manipulador de eventos é uma parte interna comum e o texto de cada item de menu é uma peça externa. Vamos falar brevemente sobre o princípio da delegação de eventos: clique no item do menu e o evento borbulhará do elemento LI para o elemento UL. Quando vinculamos o evento ao UL, na verdade vinculamos um evento e, em seguida, usamos o destino no evento de parâmetros do evento para determinar qual elemento o clique é. Por exemplo, o primeiro elemento Li no nível baixo, Event.Target Is Li. Dessa forma, podemos obter o elemento de clique específico e podemos lidar de maneira diferente de acordo com diferentes elementos.
Resumir
O modo de enciclopédia é um meio de otimizar o desempenho do programa e reduzir o número de objetos, compartilhando dados públicos para obter programas de otimização. O modo de enciclopédia é adequado para cenários em que há um grande número de objetos e requisitos de desempenho semelhantes. Como o modo Xiangyuan precisa separar dados internos e externos, aumenta a complexidade lógica do programa, é recomendável usar o modo Xiangyuan somente quando houver requisitos de desempenho.
Os benefícios de aproveitar o modelo Yuan:
A conformidade com os recursos das páginas da Web pode ser reduzida por ordens de magnitude. Mesmo que a aplicação do modo Xiangyuan não possa reduzir o número de instâncias a uma, você ainda pode se beneficiar muito com ele.
Essa economia não requer muita modificação do código original. Depois de criar o gerente, a fábrica e a Xiangyuan, as modificações no código nada mais são do que mudar de instanciar diretamente a classe de destino para chamar um método do objeto do gerente.
Desvantagens de aproveitar o modo Yuan:
Se for usado em locais desnecessários, o resultado realmente danificará a eficiência de execução do código. Esse padrão otimiza o código e também aumenta sua complexidade, o que pode causar dificuldades na depuração e manutenção.
Isso dificulta a depuração porque agora existem três erros possíveis: gerente, fábrica e Xiangyuan.
Essa otimização também pode dificultar a manutenção. Agora você não está enfrentando uma arquitetura clara composta por objetos que encapsulam dados, mas um monte de coisas confusas. Os dados são salvos em pelo menos dois lugares. É melhor comentar os dados internos e os dados externos.
Essa otimização só deve ser feita quando necessário. Uma troca deve ser feita entre eficiência operacional e manutenção. Se você não tiver certeza se precisa usar o modo de enciclopédia, provavelmente não precisa dele. O modo Xiangyuan é adequado para ocasiões, como recursos do sistema, tem sido usado quase e obviamente, é necessário algum tipo de otimização.
Esse padrão é especialmente útil para programadores JavaScript, pois pode ser usado para reduzir o número de elementos DOM a serem usados em uma página da web, sabendo que esses elementos consomem muita memória. O uso desse padrão e tipo organizacional, como padrões de combinação, pode desenvolver sistemas complexos de aplicativos da Web ricos em recursos que podem ser executados sem problemas em qualquer ambiente javascript moderno.
Ocasiões aplicáveis para o modo Xiangyuan:
Um grande número de objetos intensivos em recursos deve ser usado na página da web. Se apenas alguns desses objetos forem usados, esse tipo de otimização não será econômico.
Pelo menos uma parte dos dados armazenados no objeto pode ser convertida em dados externos. Além disso, armazenar esses dados fora do objeto deve ter relativamente poucos recursos, caso contrário, essa abordagem não tem sentido para o desempenho sugere. O tipo de objeto que contém uma grande quantidade de código básico e conteúdo HTML pode ser mais adequado para esse tipo de otimização.
Depois de separar os dados externos, o número de objetos exclusivos é relativamente pequeno.