1. Qu'est-ce que le modèle Proxy
Le modèle proxy est un modèle de conception structurel qui agit comme un proxy pour contrôler l'accès à un objet particulier. En fonction de l'objet cible (l'objet étant utilisé comme cible), le modèle proxy fournit un objet proxy grâce auquel les clients peuvent accéder à l'objet cible, permettant d'ajouter des fonctionnalités supplémentaires à l'objet cible.
1.1 Définition du modèle Proxy
Le modèle proxy est un modèle de conception qui implique la collaboration de deux objets ou plus. Un objet est l'objet cible réel étant appelé, tandis qu'un ou plusieurs autres objets agissent comme des objets proxy. Les objets proxy interceptent l'accès à l'objet cible, fournissant un moyen indirect pour y accéder.
1.2 Objectifs et Buts du modèle Proxy
Le but principal du modèle proxy est de fournir un moyen indirect d'accéder à l'objet cible, permettant d'ajouter des fonctionnalités supplémentaires à l'objet cible. Les objets proxy peuvent gérer une logique commune, telle que le contrôle d'accès à l'objet cible, la mise en cache et la journalisation. Le modèle proxy peut également implémenter le chargement paresseux, n'instanciant l'objet cible que lorsque nécessaire.
2. Caractéristiques et Avantages du modèle Proxy
Le modèle proxy présente les caractéristiques et avantages suivants :
- Il peut étendre la fonctionnalité de l'objet cible sans le modifier.
- Il peut contrôler l'accès à l'objet cible grâce à l'objet proxy.
- Il peut effectuer des opérations supplémentaires avant ou après l'accès à l'objet cible.
- Il peut implémenter le chargement paresseux, n'instanciant l'objet cible que lorsque nécessaire.
3. Exemples d'applications pratiques du modèle Proxy
Le modèle proxy est largement utilisé dans de nombreux scénarios d'application. Voici quelques exemples courants d'applications pratiques :
- Proxy distant : utilisé pour accéder à des objets sur le réseau localement.
- Proxy virtuel : utilisé pour créer des objets coûteux au besoin.
- Proxy de sécurité : utilisé pour contrôler l'accès aux objets.
- Référence intelligente : utilisée pour effectuer des opérations supplémentaires lors de l'accès aux objets, comme le comptage des objets.
4.1 Diagramme de classe UML
Voici le diagramme de classe UML du modèle Proxy en Golang :
4.2 Introduction de l'exemple
Supposons que nous ayons une interface Subject
qui définit une méthode Request
. Nous avons une classe d'implémentation concrète RealSubject
, qui implémente l'interface Subject
. Ensuite, nous créons une classe proxy Proxy
, qui détient un objet RealSubject
et implémente également l'interface Subject
. Dans la méthode Request
de la classe Proxy
, nous pouvons effectuer des opérations supplémentaires avant ou après l'appel de la méthode Request
de RealSubject
.
4.3 Étape 1 de l'implémentation : Définir l'interface Proxy
Tout d'abord, nous devons définir une interface Subject
qui contient une méthode Request
:
package main
type Subject interface {
Request()
}
4.4 Étape 2 de l'implémentation : Implémenter l'objet cible
Ensuite, nous implémentons l'objet cible spécifique RealSubject
, qui implémente l'interface Subject
:
package main
import "fmt"
type RealSubject struct {}
func (r *RealSubject) Request() {
fmt.Println("RealSubject: Gestion de la requête")
}
4.5 Étape 3 de l'implémentation : Implémenter l'objet proxy
Ensuite, nous créons un objet proxy, Proxy, qui détient un objet RealSubject et implémente l'interface Subject. Dans la méthode Request de Proxy, nous pouvons effectuer des opérations supplémentaires avant ou après l'appel de la méthode Request de RealSubject :
package main
import "fmt"
type Proxy struct {
realSubject *RealSubject
}
func (p *Proxy) Request() {
fmt.Println("Proxy : Pré-requête")
if p.realSubject == nil {
p.realSubject = &RealSubject{}
}
p.realSubject.Request()
fmt.Println("Proxy : Post-requête")
}
4.6 Étape 4 de l'implémentation : Appeler l'objet proxy
Enfin, nous pouvons utiliser l'objet proxy, Proxy, pour appeler les méthodes de l'objet proxifié, RealSubject :
package main
func main() {
proxy := Proxy{}
proxy.Request()
}
L'exécution du code ci-dessus produira la sortie :
Proxy : Pré-requête
RealSubject: Gestion de la requête
Proxy : Post-requête
5.1 La Différence et la Connexion entre le Patron Proxy et le Patron Décorateur
Le patron proxy et le patron décorateur sont tous deux des patrons de conception structurels. Ils comprennent tous deux un objet cible et un objet proxy/décorateur, mais il existe des différences entre les deux :
- Le patron proxy implique généralement un contrôle d'accès à l'objet cible, tandis que le patron décorateur se concentre davantage sur l'extension de l'objet cible.
- Le patron proxy effectue généralement des opérations supplémentaires avant ou après l'objet cible, tandis que le patron décorateur ajoute dynamiquement des fonctionnalités supplémentaires à l'objet cible.
5.2 Comparaison entre le Proxy Statique et le Proxy Dynamique
Le patron proxy peut être divisé en proxy statique et proxy dynamique. Le proxy statique détermine le type de l'objet proxy au moment de la compilation, et l'objet proxy est manuellement écrit par le programmeur. Le proxy dynamique, en revanche, génère dynamiquement l'objet proxy au moment de l'exécution en fonction de l'interface de l'objet cible. Le proxy dynamique est plus flexible mais aussi plus complexe par rapport à son homologue statique.
5.3 Application du Patron Proxy dans les Microservices
Le patron proxy peut être appliqué dans une architecture de microservices. Par exemple, nous pouvons utiliser un proxy pour encapsuler l'accès à d'autres microservices et mettre en place des mécanismes tels que l'équilibrage de charge, la limitation du taux et la fermeture de circuit au niveau du proxy. Cela peut améliorer la fiabilité et les performances du système. Le patron proxy peut également être utilisé pour mettre en œuvre la découverte de services et les fonctionnalités de routage.