concept
Mode proxy: le mode proxy est en fait une classe de proxy supplémentaire pour effectuer certaines opérations sur l'objet d'origine. Par exemple, nous devons parfois embaucher un avocat lorsque nous allons à un procès, car les avocats ont une expertise en droit et peuvent opérer et exprimer nos idées pour nous. C'est ce que signifie l'agence. Le mode proxy est divisé en deux catégories: 1. Proxy statique (n'utilisant pas les méthodes dans JDK); 2. Proxy dynamique (en utilisant l'invocationHandler et proxy dans JDK).
Le proxy statique est créé par des programmeurs ou des outils pour générer le code source de la classe de proxy, puis compiler la classe de proxy. Le soi-disant statique signifie que le fichier bytecode de la classe proxy existe déjà avant l'exécution du programme, et la relation entre la classe de proxy et la classe de délégué est déterminée avant l'exécution.
Le code source de la classe proxy dynamique est généré dynamiquement par le JVM en fonction de la réflexion et d'autres mécanismes pendant l'opération du programme, il n'y a donc pas de fichier bytecode de la classe proxy. La relation entre la classe proxy et la classe de délégués est déterminée lors de l'exécution du programme.
Exemple
Ici, nous donnons un exemple de proxy statique:
Diagramme de classe:
/ ** * Gamer Interface * * / interface publique IgAMEPLAYER {// Connectez-vous au jeu public void Login (String User, String Motway); // Kill Monsters, la principale caractéristique des jeux en ligne public Void Killboss (); // mise à niveau public void upgrade (); } / ** * Gamer * * / Gameplayer de classe publique implémente igameplayer {private String name = ""; // passe le nom dans le jeu de jeu public du constructeur (String _name) {this.name = _name; } // Lors de la lutte contre les monstres, le plus attendu est de tuer le vieux monstre public void killboss () {System.out.println (this.name + "Kill Monsters!"); } // Vous devez vous connecter avant d'entrer dans le jeu. C'est une condition nécessaire. Public void Login (String User, String Motword) {System.out.println ("Le nom de connexion est" + utilisateur + "rôle" + this.name + "Connexion avec succès!"); } // Mettre à niveau, il existe de nombreuses façons de mettre à niveau, dépenser de l'argent pour acheter et effectuer des tâches est également une sorte de mise à niveau du public () {System.out.println (this.name + "Another Niveau!"); }} / ** * Le client n'est pas visible par l'objet Proxy * / GamePlayerProxy de classe publique implémente igamePlayer {private igamePlayer gameplayer = null; // proxy objet // passe via le constructeur à qui pratiquer le jeu public GamePlayerProxy (string username) {this.gameplayer = new GamePlayer (username); } // destinataire de Kill Monsters public void killboss () {this.gameplayer.killboss (); } // destinataire pour connecter public void Login (String User, String Motway) {this.gameplayer.login (utilisateur, mot de passe); } // Practice upgrade public void upgrade () {this.gameplayer.upgrade (); }} / * * Le client n'est pas visible par l'objet proxy * / classe publique GamePlayerProxy2 implémente igamePlayer {private igameplayer gameplayer = null; // proxy objet // passe par le constructeur à qui pratiquer le publicplayerproxy2 (string username) {this.gameplayer = newplayer) (username); } // Récipiendaire Kill Monsters public void killboss () {this.gameplayer.killboss (); } // Le destinataire Login public void Login (String User, String Motway) {System.out.println ("localString ()"); this.gameplayer.login (utilisateur, mot de passe); } // pratiquer la mise à niveau () public void mise à niveau () {this.gameplayer.upgrade (); System.out.println ("Le temps de mise à niveau est:" + new Date (). TolocaleString ()); }} / * * Le client n'est pas visible par l'objet proxy * / classe publique GamePlayerProxy3 {Gameplayer privé IgAmAplayer; // passe l'objet Proxy (proxy) via le constructeur public gameplayerproxy3 (igameplayer gameplayer) {this.gameplayer = gameplayer; System.out.println ("Je suis un proxy, le personnage que je joue est celui de quelqu'un d'autre et peut être passé dynamiquement"); } public igameplayer getProxy () {return (igameplayer) proxy.newproxyinstance (this.getClass (). getClassLoader (), new class [] {igameplayer.class}, new MyInVocationHandler ()); } classe privée MyInvocationHandler implémente invocationHandler {@Override public objet invoke (proxy d'objet, méthode de la méthode, objet [] args) lance throwable {if (method.getName (). equals ("login")) {System.out.println ("localString ()"); } if (method.getName (). equals ("mise à niveau")) {System.out.println ("L'heure de mise à niveau est:" + new Date (). TolocaleString ()); } méthode.invoke (gameplayer, args); retourner null; }}} Classe publique Test {public static void main (String [] args) {/ * * Proxy statique normal: le client ne connaît pas l'objet proxy, et l'objet proxy complète son appel de fonction * / igamePlayer proxy = new GameplayerProxy ("x"); System.out.println ("L'heure de début est:" + new Date (). TolocaleString ()); proxy.login ("Zhangsan", "ABCD"); proxy.killboss (); proxy.upgrade (); System.out.println ("L'heure de fin est:" + new Date (). TolocaleString ()); System.out.println (); / * * L'objet proxy améliore la fonction de l'objet proxy * / igameplayer proxy2 = nouveau gameplayerproxy2 ("m"); proxy2.login ("lisi", "efg"); proxy2.killboss (); proxy2.upgrade (); System.out.println (); / * * Dynamic Proxy: Utilisez l'invocationHandler fourni par JDK pour refléter la méthode d'appel de l'objet proxy * combinée avec java.reflect.proxy pour générer des objets proxy * Entrez dynamiquement l'objet proxy pour construire le Handler Invocation, et les fonctions: (edit-oriented :) where invoked) ou dans d'autres mots: (edit-orienté (Notification) * Dans GamePlayerProxy3, c'est l'heure de début de la notification lorsque la méthode est appelée connexion, et l'heure de fin de la notification lorsque la mise à niveau * / gameplayerProxy3 Dynamic = new GamePlayerProxy3 (nouveau gameplayer ("y")); IgamePlayer dynamicplayer = dynamic.getProxy (); dynamicplayer.login ("wangwu", "1234"); dynamicplayer.killboss (); dynamicplayer.upgrade (); / * * Edit-orienté: une logique métier similaire doit être ajoutée à de nombreux endroits, afin que nous puissions l'extraire dans la section, qui est la section de transaction: telle que la section du journal, la section d'autorisation, la section commerciale * /}} Imprimer:
L'heure de début est: 2014-10-8 17:19:05 Le rôle de connexion X avec Zhangsan est connecté avec succès! X combat des monstres! X a été mis à niveau vers un autre niveau! L'heure de fin est: 2014-10-8 17:19:05 Le temps de connexion est: 2014-10-8 17:19:05 Le rôle de connexion M avec le nom Lisi est connecté avec succès! M combat les monstres! M a été mis à niveau vers un autre niveau! Le temps de mise à niveau est: 2014-10-8 17:19:05 Je suis un joueur proxy. Le personnage que je joue est celui de quelqu'un d'autre, et je peux le transmettre dynamiquement pour vous connecter. Le temps est: 2014-10-8 17:19:05 Le personnage de connexion Y avec le nom Wangwu a été connecté avec succès! Y combat des monstres! Le temps de mise à niveau est: 2014-10-8 17:19:05 Y a été mis à niveau à un autre niveau!
avantage
(1) Le rôle des responsabilités claires est de réaliser une logique professionnelle réelle, et vous n'avez pas à vous soucier d'autres affaires non responsables. Vous pouvez effectuer une transaction via un agent ultérieur. Le résultat qui l'accompagne est une programmation concise et claire.
(2) L'objet proxy peut agir comme un intermédiaire entre le client et l'objet cible, qui joue un rôle et protège l'objet cible.
(3) élevée élevée