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
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.
Le modèle Proxy est particulièrement utile lorsque :
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 :
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).
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.
// 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 :
2). L'image proxy :
3). Utilisation :
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 :
2). Gestion des getOperations :
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 :
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!