Maison interface Web js tutoriel Interprétation détaillée du modèle de poids mouche dans la programmation de modèles de conception JavaScript

Interprétation détaillée du modèle de poids mouche dans la programmation de modèles de conception JavaScript

May 21, 2018 pm 01:38 PM
javascript js 设计模式

Le modèle flyweight est le plus approprié pour résoudre les problèmes de performances causés par la création d'un grand nombre d'objets similaires. Cet article résumera l'utilisation du modèle flyweight dans la programmation de modèles de conception JavaScript, y compris des exemples d'utilisation lors des opérations DOM :

Le modèle de poids mouche est différent du modèle de conception général. Il est principalement utilisé pour optimiser les performances du programme. Il est le plus approprié pour résoudre les problèmes de performances causés par un grand nombre d'objets similaires. Le mode Flyweight améliore les performances des applications en analysant les objets de l'application et en les analysant en données intrinsèques et en données extrinsèques, réduisant ainsi le nombre d'objets.

Connaissances de base

Le mode Flyweight réduit le nombre d'objets en partageant un grand nombre d'objets à granularité fine, réduisant ainsi la mémoire des objets et améliorant les performances des applications. L'idée de base est de décomposer les composants d'objets similaires existants et de les développer en données intrinsèques partageables et en données extrinsèques non partageables. Nous appelons les objets de données intrinsèques des objets poids mouche. Habituellement, une classe d'usine est également nécessaire pour conserver les données internes.
En JS, le modèle flyweight se compose principalement des rôles suivants :
(1) Client : une classe utilisée pour appeler la fabrique de poids mouche pour obtenir des données intrinsèques, généralement les objets requis par l'application,
(2 ) Usine de poids mouche : une classe utilisée pour conserver les données de poids mouche
(3) Classe de poids mouche : une classe qui conserve les données internes

Mise en œuvre et application du modèle de poids mouche

Mise en œuvre générale

Prenons un exemple pour illustrer : Apple produit en masse des iPhones. La plupart des données de l'iPhone telles que le modèle et l'écran sont les mêmes, mais quelques parties des données sont les mêmes. pareil. Par exemple, la mémoire est divisée en 16G, 32G, etc. Avant d'utiliser le mode poids mouche, nous avons écrit le code comme suit :

function Iphone(model, screen, memory, SN) {
  this. model = model;
  this.screen = screen;
  this.memory = memory;
  this.SN = SN;
}
var phones = [];
for (var i = 0; i < 1000000; i++) {
  var memory = i % 2 == 0 ? 16 : 32;
  phones.push(new Iphone("iphone6s", 5.0, memory, i));
}
Copier après la connexion

Dans ce code, un million d'iPhone sont créés, et chaque iPhone demande une mémoire indépendamment. Mais si nous regardons attentivement, nous pouvons voir que la plupart des iPhones sont similaires, sauf que la mémoire et le numéro de série sont différents. S'il s'agit d'un programme avec des exigences de performances relativement élevées, il faut envisager de l'optimiser.
Pour les programmes avec un grand nombre d'objets similaires, nous pouvons envisager d'utiliser le mode poids mouche pour l'optimiser. Nous avons analysé que la plupart des modèles, écrans et mémoires d'iPhone sont les mêmes, donc cette partie des données peut être partagée, qui est le poids mouche Les données intrinsèques du modèle définissent la classe de poids mouche comme suit :

function IphoneFlyweight(model, screen, memory) {
  this.model = model;
  this.screen = screen;
  this.memory = memory;
}
Copier après la connexion

Nous définissons la classe de poids mouche de l'iPhone, qui comprend le modèle, l'écran et les données de mémoire. Nous avons également besoin d'une usine de poids mouche pour conserver ces données :

 var flyweightFactory = (function () {
  var iphones = {};
  return {
    get: function (model, screen, memory) {
      var key = model + screen + memory;
      if (!iphones[key]) {
        iphones[key] = new IphoneFlyweight(model, screen, memory);
      }
      return iphones[key];
    }
  };
})();
Copier après la connexion

Dans cette usine, nous définissons un dictionnaire pour enregistrer les objets poids mouche, à condition qu'une méthode obtienne un Objet flyweight basé sur des paramètres. S'il existe dans le dictionnaire, il renvoie directement. Sinon, il crée un objet flyweight et le renvoie.
Ensuite, nous créons une classe client, qui est modifiée à partir de la classe iphone :

 function Iphone(model, screen, memory, SN) {
  this.flyweight = flyweightFactory.get(model, screen, memory);
  this.SN = SN;
}
Copier après la connexion

Ensuite, nous la générons toujours comme avant Plusieurs iphones

var phones = [];
for (var i = 0; i < 1000000; i++) {
  var memory = i % 2 == 0 ? 16 : 32;
  phones.push(new Iphone("iphone6s", 5.0, memory, i));
}
console.log(phones);
Copier après la connexion

La clé ici est this.flyweight = flyweightFactory.get(model, screen, memory) dans le constructeur de l'Iphone. Ce code obtient les données de poids mouche via l'usine de poids mouche. Dans l'usine de poids mouche, si un objet avec les mêmes données existe déjà, l'objet sera renvoyé directement. Plusieurs objets iPhone partagent cette partie des mêmes données, de sorte que les données similaires d'origine ont été. Utilisation de la mémoire considérablement réduite.

Application du mode poids mouche dans DOM

Une application typique du mode poids mouche est le fonctionnement des événements DOM. Le mécanisme d'événements DOM est divisé en bouillonnement d'événements et capture d'événements. Présentons brièvement les deux :
Bullage d'événement : l'événement lié commence à se déclencher à partir de l'élément le plus interne, puis remonte jusqu'à l'élément le plus externe.
Capture d'événement : l'événement lié commence à partir de l'élément le plus externe. pour déclencher puis passe à la couche la plus interne
Supposons que nous ayons une liste de menu en HTML

<ul class="menu">
  <li class="item">选项1</li>
  <li class="item">选项2</li>
  <li class="item">选项3</li>
  <li class="item">选项4</li>
  <li class="item">选项5</li>
  <li class="item">选项6</li>
</ul>
Copier après la connexion

Cliquez sur l'élément de menu pour effectuer l'action correspondante opération , nous lions les événements via jQuery, en faisant généralement ceci :

$(".item").on("click", function () {
  console.log($(this).text());
})
Copier après la connexion

Liez les événements à chaque élément de la liste et cliquez pour afficher le texte correspondant. Il n'y a pas de problème de cette manière pour le moment, mais s'il s'agit d'une très longue liste, surtout s'il s'agit d'une très longue liste sur le terminal mobile, il y aura des problèmes de performances, car chaque élément est lié à un événement et prend jusqu'à la mémoire. Mais ces gestionnaires d’événements sont en réalité très similaires, nous devons donc les optimiser.

$(".menu").on("click", ".item", function () {
  console.log($(this).text());
})
Copier après la connexion

La liaison d'événements de cette manière peut réduire le nombre de gestionnaires d'événements. Cette méthode est appelée délégation d'événements, et elle utilise également les principes des poids mouches du modèle. . Le gestionnaire d'événements est la partie interne commune et le texte respectif de chaque élément de menu est la partie externe. Parlons brièvement du principe de la délégation d'événement : lorsque vous cliquez sur un élément de menu, l'événement passe de l'élément li à l'élément ul. Lorsque nous lions l'événement à ul, nous lions en fait un événement, puis utilisons la cible. dans le paramètre d'événement event pour déterminer sur quel élément a été cliqué, par exemple, le premier élément li de bas niveau, event.target est li, afin que vous puissiez obtenir l'élément spécifique sur lequel vous avez cliqué et effectuer différents traitements en fonction de différents éléments.

Résumé

Le mode Flyweight est un moyen d'optimiser les performances du programme. Il réduit le nombre d'objets en partageant des données communes pour optimiser le programme. Le mode Flyweight convient aux scénarios comportant un grand nombre d’objets similaires et des exigences de performances élevées. Étant donné que le mode poids mouche nécessite la séparation des données internes et externes, ce qui augmente la complexité logique du programme, il est recommandé d'utiliser le mode poids mouche uniquement lorsque des performances sont requises.

Avantages du mode poids mouche :
Il peut réduire les besoins en ressources des pages Web de plusieurs ordres de grandeur. Même si l’application du mode poids mouche ne peut pas réduire le nombre d’instances à une, vous pouvez quand même en bénéficier grandement.

Ce type de sauvegarde ne nécessite pas de modification importante du code d'origine. Après avoir créé le gestionnaire, l'usine et le poids mouche, la seule modification à apporter au code est de passer de l'instanciation directe de la classe cible à l'appel d'une méthode de l'objet gestionnaire.

Inconvénients du mode poids mouche :
S'il est utilisé à des endroits inutiles, le résultat sera préjudiciable à l'efficacité du code. Si ce mode optimise le code, il augmente également sa complexité, ce qui rend le débogage et la maintenance difficiles.

La raison pour laquelle cela gêne le débogage est qu'il y a désormais trois endroits possibles qui peuvent mal tourner : le directeur, l'usine et le poids mouche.

Cette optimisation rendra également la maintenance plus difficile. Au lieu d’une structure claire composée d’objets encapsulant des données, vous êtes désormais confronté à un ensemble de choses fragmentées et désordonnées. Les données sont enregistrées à au moins deux endroits. Il est préférable d'annoter les données internes et externes.

Cette optimisation ne doit être effectuée que lorsque cela est nécessaire. Un compromis doit être fait entre efficacité opérationnelle et maintenabilité. Si vous ne savez pas si vous devez utiliser le mode poids mouche, vous n'en avez probablement pas besoin. Le mode Flyweight convient aux situations où les ressources du système sont presque entièrement utilisées et où une certaine sorte d’optimisation est évidemment nécessaire.

Ce mode est particulièrement utile aux programmeurs Javascript car il peut être utilisé pour réduire le nombre d'éléments DOM utilisés sur une page web, sachant que ces éléments consomment beaucoup de mémoire. La combinaison de ce modèle avec des modèles organisationnels tels que le modèle Composite vous permet de développer des applications Web complexes et riches en fonctionnalités qui peuvent fonctionner correctement dans n'importe quel environnement Javascript moderne.

Occasions applicables du mode poids mouche :
Un grand nombre d'objets gourmands en ressources doivent être utilisés dans les pages Web. Si seulement quelques objets de ce type sont utilisés, cette optimisation n’est pas rentable.

Au moins une partie des données stockées dans l'objet peut être convertie en données externes. De plus, le stockage de ces données en dehors de l'objet devrait être relativement peu coûteux, sinon les implications de cette approche en termes de performances n'ont pratiquement aucun sens. Les objets contenant beaucoup de code de base et de contenu HTML peuvent être mieux adaptés à cette optimisation.

Une fois les données extrinsèques séparées, le nombre d'objets uniques est relativement faible.

Ce qui précède est ce que j'ai compilé pour vous. J'espère que cela vous sera utile à l'avenir.

Articles associés :

javascriptPlusieurs méthodes de définition de tableau (tutoriel graphique)

À propos javascriptCollection d'instructions de contrôle de flux (tutoriel image et texte)

Compréhension approfondie et utilisation pratique de la fonction javascript (Code ci-joint)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre les modèles de conception et les modèles architecturaux dans le framework Java La différence entre les modèles de conception et les modèles architecturaux dans le framework Java Jun 02, 2024 pm 12:59 PM

Dans le framework Java, la différence entre les modèles de conception et les modèles architecturaux réside dans le fait que les modèles de conception définissent des solutions abstraites aux problèmes courants de conception de logiciels, en se concentrant sur l'interaction entre les classes et les objets, tels que les modèles d'usine. Les modèles architecturaux définissent la relation entre les structures et les modules du système, en se concentrant sur l'organisation et l'interaction des composants du système, tels que l'architecture en couches.

Analyse du modèle de décorateur dans les modèles de conception Java Analyse du modèle de décorateur dans les modèles de conception Java May 09, 2024 pm 03:12 PM

Le modèle décorateur est un modèle de conception structurelle qui permet l’ajout dynamique de fonctionnalités d’objet sans modifier la classe d’origine. Il est mis en œuvre grâce à la collaboration de composants abstraits, de composants concrets, de décorateurs abstraits et de décorateurs concrets, et peut étendre de manière flexible les fonctions de classe pour répondre aux besoins changeants. Dans cet exemple, des décorateurs de lait et de moka sont ajoutés à Espresso pour un prix total de 2,29 $, démontrant la puissance du modèle de décorateur pour modifier dynamiquement le comportement des objets.

Analyse de cas pratique du modèle de conception PHP Analyse de cas pratique du modèle de conception PHP May 08, 2024 am 08:09 AM

1. Modèle d'usine : séparez la création d'objets et la logique métier, et créez des objets des types spécifiés via des classes d'usine. 2. Modèle d'observateur : permet aux objets sujets d'informer les objets observateurs de leurs changements d'état, obtenant ainsi un couplage lâche et un modèle d'observateur.

Comment les modèles de conception gèrent les défis de maintenance du code Comment les modèles de conception gèrent les défis de maintenance du code May 09, 2024 pm 12:45 PM

Les modèles de conception résolvent les problèmes de maintenance du code en fournissant des solutions réutilisables et extensibles : Modèle d'observateur : permet aux objets de s'abonner aux événements et de recevoir des notifications lorsqu'ils se produisent. Factory Pattern : fournit un moyen centralisé de créer des objets sans recourir à des classes concrètes. Modèle Singleton : garantit qu'une classe n'a qu'une seule instance, qui est utilisée pour créer des objets accessibles globalement.

L'utilisation merveilleuse du modèle d'adaptateur dans les modèles de conception Java L'utilisation merveilleuse du modèle d'adaptateur dans les modèles de conception Java May 09, 2024 pm 12:54 PM

Le modèle Adaptateur est un modèle de conception structurelle qui permet à des objets incompatibles de fonctionner ensemble. Il convertit une interface en une autre afin que les objets puissent interagir de manière fluide. L'adaptateur d'objet implémente le modèle d'adaptateur en créant un objet adaptateur contenant l'objet adapté et en implémentant l'interface cible. Dans un cas pratique, grâce au mode adaptateur, le client (tel que MediaPlayer) peut lire des médias au format avancé (tels que VLC), bien qu'il ne prenne lui-même en charge que les formats multimédias ordinaires (tels que MP3).

Modèles de conception PHP : développement piloté par les tests en pratique Modèles de conception PHP : développement piloté par les tests en pratique Jun 03, 2024 pm 02:14 PM

TDD est utilisé pour écrire du code PHP de haute qualité. Les étapes comprennent : l'écriture de cas de test, la description des fonctionnalités attendues et leur échec. Écrivez du code de manière à ce que seuls les cas de test réussissent sans optimisation excessive ni conception détaillée. Une fois les cas de test réussis, optimisez et refactorisez le code pour améliorer la lisibilité, la maintenabilité et l’évolutivité.

Application des modèles de conception dans le cadre Guice Application des modèles de conception dans le cadre Guice Jun 02, 2024 pm 10:49 PM

Le framework Guice applique un certain nombre de modèles de conception, notamment : Modèle Singleton : garantir qu'une classe n'a qu'une seule instance via l'annotation @Singleton. Modèle de méthode d'usine : créez une méthode d'usine via l'annotation @Provides et obtenez l'instance d'objet lors de l'injection de dépendances. Mode stratégie : encapsulez l'algorithme dans différentes classes de stratégie et spécifiez la stratégie spécifique via l'annotation @Named.

Quels sont les avantages et les inconvénients de l'utilisation de modèles de conception dans le framework Java ? Quels sont les avantages et les inconvénients de l'utilisation de modèles de conception dans le framework Java ? Jun 01, 2024 pm 02:13 PM

Les avantages de l'utilisation de modèles de conception dans les frameworks Java incluent : une lisibilité, une maintenabilité et une évolutivité améliorées du code. Les inconvénients incluent la complexité, la surcharge de performances et la courbe d'apprentissage abrupte due à une utilisation excessive. Cas pratique : Le mode proxy permet de charger des objets paresseusement. Utilisez les modèles de conception à bon escient pour tirer parti de leurs avantages et minimiser leurs inconvénients.

See all articles