Le modèle de conception sous Linux-proxy pattern (Proxy Pattern) expliqué en termes simples [recommandé pour la collection novice]

L'essence du modèle d'agent est un middleware, l'objectif principal est de découpler les fournisseurs de services et les utilisateurs. L'utilisateur accède indirectement au prestataire via le proxy, ce qui facilite l'encapsulation et le contrôle de ce dernier. C'est un modèle structurel.

Premièrement, le but

Fournissez un objet proxy permettant aux appelants externes d'accéder au fournisseur de services.

2. Motivation

Restreignez l'accès direct aux objets cibles et réduisez le couplage.

Trois, avantages et inconvénients

Avantages :

  • Couplage bas
  • Facile à développer
  • Flexibilité élevée

Désavantages:

  • L'accès indirect peut retarder la réponse à la demande
  • augmenter la charge de travail

Quatre, classification

  • Proxy statique
  • Proxy dynamique

L'implémentation de la classe proxy elle-même n'est peut-être pas simple. De plus, chaque objet qui a besoin d'un proxy doit implémenter une classe proxy. La charge de travail elle-même est relativement importante et sujette aux erreurs. Le soi-disant proxy dynamique (DynamicProxy) fait référence à l'interface d'accès générée dynamiquement à l'objet cible lorsque le programme est en cours d'exécution. Cet article présente principalement le premier, et à propos du second, vous pouvez vous référer au proxy dynamique fourni avec le JDK.

5. Objectif principal

Le mode proxy est plus applicable dans les scénarios suivants:

  1. Agent distant
  2. Agent virtuel
  3. Agent de protection
  4. Agent de guidage intelligent
  5. Proxy de copie sur écriture
  6. Proxy de mise en cache
  7. Proxy de pare-feu
  8. Agent de synchronisation

Six, principe

Voici un diagramme de classes UML typique du modèle de proxy introduit par GoF.
Insérez la description de l'image ici
Objet:
 définit les interfaces externes de RealSubject, et ces interfaces doivent être implémentées par Proxy, de sorte que les interfaces qui appellent en externe proxy soient finalement converties en appels à realsubject.
 
RealSubject: le
 véritable objet cible.

Proxy: Le proxy de l'
objet cible, responsable du contrôle et de la gestion de l'objet cible, et passant indirectement l'accès externe à l'objet cible.

  • Proxy distant: sérialisez les requêtes et paramètres locaux, envoyez des requêtes aux objets distants, désérialisez les résultats de la réponse et renvoyez les résultats finaux à l'appelant;
  • Proxy virtuel: lorsque le coût de création de l'objet cible est relativement élevé, l'objet cible peut être créé de manière différée ou asynchrone;
  • Proxy de protection: affinez le contrôle de l'autorité d'accès de l'objet cible;

Sept, réalisation

Ci-dessous, nous utilisons deux exemples pour expérimenter réellement l'application du mode proxy

Agent réseau
Pour certains sites Web qui ne sont pas directement accessibles en Chine, un agent réseau légalement utilisé peut réaliser l'accès au site Web cible;
Insérez la description de l'image ici
définir la classe d'interface publique Serveur:

public interface Server{
    
    
    void visit(String url);
}

Serveur proxy:

public class ProxyServer implements Server{
    
    
 
   private RealServer realServer;
 
   public ProxyServer(String serverName){
    
    
      this.realServer = new RealServer(serverName);
   }
 
   @Override
   public void visit(String url) {
    
    
      realServer.visit(url);
   }
}

Serveur cible RealServer:

public class RealServer implements Server {
    
    
    private String serverName;
    public RealServer(String serverName) {
    
    
        this.serverName = serverName;
        System.out.println("This is " + serverName);
    }
    
    @Override
    public void visit(String url) {
    
    
        response(url);
    }
    
    private void response(String res) {
    
    
        System.out.println("This is response of " + res + " from server:" + serverName);
    }
}

Démo:

public class Demo {
    
    
    public static void main(String[] args) {
    
    
        Server server = new ProxyServer("www.google.com");
        server.visit("map.google.com");
    }
}

Comptage de référence de pointeur intelligent

Ce qui suit utilise le mode proxy pour simuler simplement le problème de comptage de références de pointeur

Classe d'interface Obj:

public interface Obj{
    
    
    void GetAttr();
    Obj copy();
    void delete();
}

Classe de pointeur intelligent SmartPointer:

View Code

Classe d'objets référencés RealObj:

View Code

Qu'attendez-vous? Je recommande mon groupe d'échange de langues linuxC / C ++: [ 1106675687 ] J'ai compilé des livres d'apprentissage et du matériel vidéo que je pense qu'il vaut mieux partager dans les fichiers du groupe, et vous pouvez les ajouter si vous en avez besoin! Les 100 premiers entrent dans le groupe pour recevoir, une copie supplémentaire de C / C ++, du matériel Linux d'une valeur de 199 sera donné (didacticiels vidéo, e-books, projets de combat et codes), la partie suivante est affichée.

Insérez la description de l'image ici
Insérez la description de l'image ici

Je suppose que tu aimes

Origine blog.csdn.net/m0_50662680/article/details/112606880
conseillé
Classement