Maison interface Web js tutoriel Modèle de conception de proxy

Modèle de conception de proxy

Oct 19, 2024 pm 12:36 PM

Proxy Design Pattern

Dans mes blogs précédents, j'ai exploré divers modèles de conception créative qui traitent des mécanismes de création d'objets. Il est maintenant temps de plonger dans les modèles de conception structurelle, qui se concentrent sur la façon dont les objets et les classes sont composés pour former des structures plus grandes tout en les gardant flexibles et efficaces. Commençons par le modèle de conception de proxy

Modèle de conception de proxy en JavaScript

Le modèle de conception Proxy est un modèle de conception structurel qui fournit un objet représentant un autre objet. Il agit comme un intermédiaire qui contrôle l'accès à l'objet réel, en ajoutant des comportements supplémentaires tels qu'une initialisation paresseuse, une journalisation, un contrôle d'accès ou une mise en cache, sans modifier le code de l'objet d'origine.

En JavaScript, les proxys sont des fonctionnalités intégrées fournies par l'objet Proxy, vous permettant de définir un comportement personnalisé pour les opérations fondamentales telles que l'accès aux propriétés, l'affectation, l'invocation de fonctions, etc.

Quand avons-nous besoin du modèle de proxy ?

Le modèle Proxy est particulièrement utile lorsque :

  • Initialisation paresseuse : Vous souhaitez retarder la création d'un objet gourmand en ressources jusqu'à ce qu'il soit nécessaire.
  • Contrôle d'accès : Vous devez contrôler l'accès à un objet, par exemple, pour restreindre les accès non autorisés ou pour limiter les opérations en fonction de conditions.
  • Journalisation : Vous souhaitez enregistrer des actions sur un objet (par exemple, accès à une propriété ou appels de méthode).
  • Mise en cache : Vous souhaitez mettre en cache le résultat d'opérations coûteuses pour éviter les calculs redondants.

Composants du modèle de proxy

  1. Sujet : L'interface qui définit les opérations communes à la fois pour l'objet réel et le proxy.
  2. RealSubject : L'objet réel qui effectue le vrai travail.
  3. Proxy : L'intermédiaire qui contrôle l'accès au RealSubject.

Analogie:

Imaginez que vous ayez un grand tableau que vous souhaitez montrer à vos invités, mais qu'il faut beaucoup de temps pour le sortir d'un débarras (car il est lourd et prend du temps à transporter). Au lieu d'attendre cela à chaque fois, vous décidez d'utiliser une petite image de carte postale du tableau pour leur montrer rapidement pendant qu'ils attendent que le tableau lui-même soit récupéré.

Dans cette analogie :

  • Le grand tableau est l'objet réel (comme une image qui met du temps à se charger).
  • La carte postale est le proxy (un substitut léger qui intervient jusqu'à ce que l'objet réel soit prêt).
  • Une fois le vrai tableau prêt, vous montrez le véritable à vos invités.

Analogie du monde réel :

Considérez un agent immobilier comme un mandataire. Lorsque vous souhaitez acheter une maison, vous ne visitez pas immédiatement chaque maison (chargement de l’objet réel). Au lieu de cela, l’agent immobilier (mandataire) vous montre d’abord des photos et des descriptions. Ce n'est que lorsque vous êtes prêt à acheter (c'est-à-dire lorsque vous appelez display()) que l'agent organise une visite à domicile (charge l'objet réel).

Exemple concret : chargement d'images (proxy virtuel)

Prenons l'exemple du chargement d'une image dans une application web où l'on souhaite retarder le chargement de l'image jusqu'à ce que l'utilisateur le demande (chargement paresseux). Un proxy peut servir d'espace réservé jusqu'à ce que l'image réelle soit chargée.

Voici comment implémenter le modèle de conception Proxy en JavaScript.

Exemple : proxy pour le chargement d'images

// Step 1: The real object
class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadImageFromDisk();
  }

  loadImageFromDisk() {
    console.log(`Loading ${this.filename} from disk...`);
  }

  display() {
    console.log(`Displaying ${this.filename}`);
  }
}

// Step 2: The proxy object
class ProxyImage {
  constructor(filename) {
    this.realImage = null; // no real image yet
    this.filename = filename;
  }

  display() {
    if (this.realImage === null) {
      // load the real image only when needed
      this.realImage = new RealImage(this.filename);
    }
    this.realImage.display(); // display the real image
  }
}

// Step 3: Using the proxy to display the image
const image = new ProxyImage("photo.jpg");
image.display(); // Loads and displays the image
image.display(); // Just displays the image (already loaded)

Explication :

1). La vraie image :

  • La classe RealImage représente l'image réelle.
  • Il prend un nom de fichier en entrée et simule le processus fastidieux de chargement de l'image à partir du disque (indiqué par la méthode loadImageFromDisk).
  • Une fois chargée, la méthode d'affichage est utilisée pour afficher l'image.

2). L'image proxy :

  • La classe ProxyImage agit comme un remplaçant pour la RealImage. Il ne charge pas immédiatement l’image réelle.
  • Il contient une référence à l’image réelle (mais au départ c’est nul car l’image réelle n’a pas encore été chargée).
  • Lorsque vous appelez la méthode d'affichage sur le proxy, elle vérifie si l'image réelle a été chargée. Sinon, il le charge d'abord, puis l'affiche.

3). Utilisation :

  • Lorsque nous créons une instance de ProxyImage, l'image réelle n'est pas encore chargée (car elle consomme beaucoup de ressources).
  • La première fois que displayest appelé, le proxy charge l'image (à l'aide de la classe RealImage) puis l'affiche.
  • La deuxième fois que l'affichage est appelé, l'image réelle a déjà été chargée, il affiche donc uniquement l'image sans la charger à nouveau.

L'objet Proxy intégré

Le proxy ES6 se compose d'un constructeur de proxy qui accepte une cible et un gestionnaire comme arguments

const proxy = new Proxy(target, handler)

Ici, target représente l'objet sur lequel le proxy est appliqué, tandis que handler est un objet spécial qui définit le comportement du proxy.

L'objet gestionnaire contient une série de méthodes facultatives avec des noms prédéfinis appelées méthodes trap (par exemple apply,get,set et has) qui sont automatiquement appelées lorsque les opérations correspondantes sont effectuées sur l'instance proxy.

Comprenons cela en implémentant la calculatrice à l'aide du proxy intégré

// Step 1: The real object
class RealImage {
  constructor(filename) {
    this.filename = filename;
    this.loadImageFromDisk();
  }

  loadImageFromDisk() {
    console.log(`Loading ${this.filename} from disk...`);
  }

  display() {
    console.log(`Displaying ${this.filename}`);
  }
}

// Step 2: The proxy object
class ProxyImage {
  constructor(filename) {
    this.realImage = null; // no real image yet
    this.filename = filename;
  }

  display() {
    if (this.realImage === null) {
      // load the real image only when needed
      this.realImage = new RealImage(this.filename);
    }
    this.realImage.display(); // display the real image
  }
}

// Step 3: Using the proxy to display the image
const image = new ProxyImage("photo.jpg");
image.display(); // Loads and displays the image
image.display(); // Just displays the image (already loaded)

La meilleure partie en utilisant le proxy de cette façon :

  • L'objet proxy hérite du prototype de la classe Calculatrice d'origine.
  • Les mutations sont évitées grâce au piège posé par le proxy.

Explication du Code

1). Héritage des prototypes :

  • Le proxy n'interfère pas avec le prototype original de la classe **Calculator **.
  • ceci est confirmé en vérifiant si proxyedCalculator.proto === Calculator.prototype. Le résultat sera vrai.

2). Gestion des getOperations :

  • Le piège get intercepte l'accès aux propriétés sur l'objet proxy.
  • Nous utilisons Reflect.get pour accéder en toute sécurité aux propriétés et méthodes de l'objet d'origine.

3). Prévenir les mutations :

Le piège set génère une erreur chaque fois qu'il y a une tentative de modification d'une propriété sur l'objet cible. Cela garantit l'immuabilité.

4). Utilisation de méthodes prototypes via le proxy :

Le proxy permet d'accéder à des méthodes telles que l'addition, la soustraction, la multiplication et la division, qui sont toutes définies sur le prototype de l'objet d'origine.

Les points clés à observer ici sont :

  • Préserve l'héritage du prototype : Le proxy conserve l'accès à toutes les méthodes du prototype, ce qui le fait se comporter comme la calculatrice d'origine.
  • Empêche la mutation : Le piège défini garantit que l'état interne de l'objet calculatrice ne peut pas être modifié de manière inattendue.
  • Accès sécurisé aux propriétés et aux méthodes : Le piège get garantit que seules les propriétés valides sont accessibles, améliorant ainsi la robustesse.

Si vous êtes arrivé jusqu'ici, n'oubliez pas d'aimer ❤️ et de laisser un commentaire ci-dessous si vous avez des questions ou des idées. Vos commentaires comptent énormément pour moi et j'aimerais avoir de vos nouvelles !

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

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.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Rimworld Odyssey Comment pêcher
1 Il y a quelques mois By Jack chen
Puis-je avoir deux comptes Alipay?
1 Il y a quelques mois By 下次还敢
Guide du débutant de Rimworld: Odyssey
1 Il y a quelques mois By Jack chen
Porce de variable PHP expliquée
3 Il y a quelques semaines By 百草

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)

Sujets chauds

Tutoriel PHP
1506
276
Comment faire une demande HTTP dans Node.js? Comment faire une demande HTTP dans Node.js? Jul 13, 2025 am 02:18 AM

Il existe trois façons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Types de données JavaScript: référence primitive vs Types de données JavaScript: référence primitive vs Jul 13, 2025 am 02:43 AM

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la chaîne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Comment vérifier si un tableau comprend une valeur en javascript Comment vérifier si un tableau comprend une valeur en javascript Jul 13, 2025 am 02:16 AM

Dans JavaScript, vérifiez si un tableau contient une certaine valeur. La méthode la plus courante est Inclut (), qui renvoie une valeur booléenne et la syntaxe est Array.Cuecludes (ValueToFind), par exemple les fruits.Cuels («banane») Renvoie vrai; S'il doit être compatible avec l'ancien environnement, utilisez l'indexof (), comme nombres.indexof (20)! == - 1 Renvoie True; Pour les objets ou les données complexes, une méthode () doit être utilisée pour une comparaison approfondie, telles que les utilisateurs.Some (user => user.id === 1) renvoie true.

Appareils et contextes avancés JavaScript Appareils et contextes avancés JavaScript Jul 24, 2025 am 12:42 AM

La portée de JavaScript détermine la portée d'accessibilité des variables, qui sont divisées en étendue globale, fonction et au niveau du bloc; Le contexte détermine la direction de cela et dépend de la méthode d'appel de fonction. 1. Les étendues incluent la portée globale (accessible n'importe où), la portée de la fonction (valide uniquement dans la fonction) et la portée au niveau du bloc (LET et const sont valides dans {}). 2. Le contexte d'exécution contient l'objet variable, la chaîne de portée et les valeurs de cela. Cela pointe vers global ou non défini dans la fonction ordinaire, l'appel de méthode pointe vers l'objet d'appel, le constructeur pointe vers le nouvel objet, et peut également être explicitement spécifié par appel / application / liaison. 3. La fermeture fait référence aux fonctions accédant et en se souvenant des variables de portée externes. Ils sont souvent utilisés pour l'encapsulation et le cache, mais peuvent provoquer

Comment obtenir la valeur d'un champ de saisie en JavaScript Comment obtenir la valeur d'un champ de saisie en JavaScript Jul 15, 2025 am 03:09 AM

Pour obtenir la valeur de la boîte d'entrée HTML, le noyau consiste à trouver l'élément correspondant via l'opération DOM et à lire l'attribut de valeur. 1. Utilisez Document.GetElementByid pour être le moyen le plus direct. Après avoir ajouté un ID à l'entrée, vous pouvez obtenir l'élément et lire la valeur via cette méthode; 2. Utilisez QueySelector pour être plus flexible, et vous pouvez sélectionner des éléments en fonction d'attributs tels que le nom, la classe, le type, etc.; 3. Vous pouvez ajouter des auditeurs d'événements d'entrée ou de modification pour atteindre des fonctions interactives, telles que l'obtention du contenu d'entrée en temps réel; 4. Faites attention au synchronisation d'exécution du script, aux erreurs d'orthographe et au jugement nul, et assurez-vous que l'élément existe avant d'accéder à la valeur.

Comment obtenir la valeur d'un bouton radio sélectionné avec JS? Comment obtenir la valeur d'un bouton radio sélectionné avec JS? Jul 18, 2025 am 04:17 AM

Il existe deux méthodes de base pour obtenir la valeur du bouton radio sélectionné. 1. Utilisez QuerySelector pour obtenir directement l'élément sélectionné, et utilisez l'entrée [name = "Votre nom-radio"]: Sélecteur vérifié pour obtenir l'élément sélectionné et lire son attribut de valeur. Il convient aux navigateurs modernes et a un code concis; 2. Utilisez Document.PetelementsByName pour traverser et trouver la première radio vérifiée via la boucle Nodelist et obtenir sa valeur, qui convient aux scénarios compatibles avec les anciens navigateurs ou nécessitent un contrôle manuel du processus; De plus, vous devez faire attention à l'orthographe de l'attribut de nom, à la gestion des situations non sélectionnées et à un chargement dynamique du contenu

Modèle JavaScript Literals: syntaxe et cas d'utilisation Modèle JavaScript Literals: syntaxe et cas d'utilisation Jul 13, 2025 am 02:28 AM

Les chaînes de modèle sont une fonctionnalité introduite dans JavaScriptes6, qui enveloppe le contenu avec des backticks et prend en charge l'interpolation variable et les chaînes multiplices. 1. Utilisez des backtticks pour définir des chaînes telles que ce point de vue en ligne; 2. Insérer des variables ou des expressions via $ {} Syntaxe tels que IAM $ {Age} Yearsold.; 3. Soutenez naturellement le texte multi-lignes sans ajouter manuellement Newlines. Les scénarios courants incluent la génération de contenu HTML dynamiquement, la sortie de chaîne multi-lignes et les coutures logiques conditionnelles simplifiées. Les notes incluent éviter les attaques d'injection, l'utilisation avancée des modèles de balises et garder la logique simple.

Construire des iframes de sable à sable sécurisé avec JavaScript Construire des iframes de sable à sable sécurisé avec JavaScript Jul 16, 2025 am 02:33 AM

Pour utiliser JavaScript pour créer un sandbox sable sécurisé iframe, utilisez d'abord l'attribut de bac à sable de HTML pour limiter le comportement IFRAME, tel que l'interdiction de l'exécution du script, des fenêtres contextuelles et de la soumission de formulaire; Deuxièmement, en ajoutant des jetons spécifiques tels que des scénaristes pour assouplir les autorisations au besoin; Combinez ensuite PostMessage () pour obtenir une communication inter-domaine sécurisée, tout en vérifiant strictement les sources et les données de messages; Enfin, évitez les erreurs de configuration courantes, telles que ne pas vérifier la source, ne pas configurer CSP, etc., et effectuer des tests de sécurité avant de se rendre en ligne.

See all articles