Konzept
Proxy -Modus: Der Proxy -Modus ist tatsächlich eine zusätzliche Proxy -Klasse, um einige Operationen im Originalobjekt auszuführen. Zum Beispiel müssen wir manchmal einen Anwalt einstellen, wenn wir in eine Klage gehen, weil Anwälte Fachkenntnisse haben und unsere Ideen für uns operieren und ausdrücken können. Das bedeutet Agentur. Der Proxy -Modus ist in zwei Kategorien unterteilt: 1. statischer Proxy (nicht die Methoden in JDK verwenden); 2. Dynamischer Proxy (mit dem InvocationHandler und dem Proxy in JDK).
Statische Proxy wird von Programmierern oder Tools erstellt, um den Quellcode der Proxy -Klasse zu generieren und dann die Proxy -Klasse zu kompilieren. Die sogenannte statische Statik bedeutet, dass die Bytecode-Datei der Proxy-Klasse bereits vor dem Ausführen des Programms existiert, und die Beziehung zwischen der Proxy-Klasse und der Delegiertenklasse wird vor dem Laufen bestimmt.
Der Quellcode der dynamischen Proxy -Klasse wird von der JVM dynamisch gemäß Reflexion und anderen Mechanismen während des Programmvorgangs generiert, sodass es keine Bytecode -Datei der Proxy -Klasse gibt. Die Beziehung zwischen der Proxy -Klasse und der Delegiertenklasse wird festgelegt, wenn das Programm ausgeführt wird.
Beispiel
Hier geben wir ein Beispiel für einen statischen Proxy:
Klassendiagramm:
/ *** Gamer Interface**/ öffentliche Schnittstelle Igameplayer {// Melden Sie sich beim Spiel öffentliche void -Anmeldung an (String -Benutzer, String -Passwort); // Töte Monster, die Hauptmerkmal von Online -Spielen Public Void Killboss (); // Upgrade Public void upgrade (); } / *** gamer**/ public class gameplayer implementiert igameplayer {private String name = ""; // den Namen über den Constructor Public Gameplayer (String _name) {this.name = _name; } // Beim Kampf gegen Monster ist es am bekanntesten, das alte Monster Public void Killboss () {System.out.println (this.name + "Kill Monsters!") Zu töten; } // Sie müssen sich anmelden, bevor Sie das Spiel eingeben. Dies ist eine notwendige Bedingung. public void Login (String -Benutzer, String -Passwort) {System.out.println ("Anmeldenname ist" + Benutzer + "Rolle" + this.name + "Anmelden erfolgreich!"); } // Upgrade gibt es viele Möglichkeiten, um zu aktualisieren, Geld zum Kauf auszugeben und Aufgaben zu erledigen, ist auch eine Art öffentlicher void upgrade () {System.out.println (this.name + "eine andere Ebene!"); }} /*** Der Kunde ist für das Proxy -Objekt nicht sichtbar*/public Class GameplayerProxy implementiert igameplayer {private igameplayer gameplayer = null; // Proxy -Objekt // den Konstruktor durchlaufen, an den öffentliches Gameplayer (Streichname) {this this this this thisha.gameplayer = New Gameplayer (username) {this this thish) {this this this this thish) = New Gameplayer (US -amp; } // Empfänger, um Monster public void Killboss () {this.gameplayer.killboss (); } // Empfänger, um public void Login (String -Benutzer, String -Passwort) {this.gameplayer.login (Benutzer, Passwort); } // upgrade public void upgrade () {this.gameplayer.upgrade (); }} /** Der Kunde ist für das Proxy -Objekt nicht sichtbar*/public Class GameplayerProxy2 implementiert igameplayer {private igameplayer gameplayer = null; // Proxy -Objekt // den Konstruktor durchgeben, an den das öffentlich -gameplay2 (starken Username) {this.gameAnname) {this.gameAnname) praktiziert werden kann. } // Empfänger töten Monsters public void Killboss () {this.gameplayer.killboss (); } // Empfängeranmeldung public void Login (String -Benutzer, String -Passwort) {System.out.println ("Localestring ()"); this.gameplayer.login (Benutzer, Passwort); } // Übung upgrade () public void upgrade () {this.gameplayer.upgrade (); System.out.println ("Upgrade -Zeit ist:" + neues Datum (). Tolocalestring ()); }} /** Der Kunde ist für das Proxy -Objekt nicht sichtbar*/ public Class GameplayerProxy3 {private igameplayer Gameplayer; // das Proxy (Proxy) -Objekt über den öffentlichen GameplayerProxy3 (igameplayer gameplayer) {this.gameplayer = Gameplayer; System.out.println ("Ich bin ein Proxy, der Charakter, den ich spiele, ist jemand anderes und kann dynamisch in"); } public igameplayer getProxy () {return (igameplayer) proxy.newproxyInstance (this.getClass (). getClassloader (), neue Klasse [] {igameplayer.class}, New MyInvocationHandler ()); } private Klasse myInvocationHandler implementiert InvocationHandler {@Override public Object Invoke (Object Proxy, Methode Methode, Object [] args) löscht Throwable {if (method.getName (). Equals ("Login") {System.out.println ("localestring ()"); } if (method.getName (). Equals ("upgrade") {System.out.println ("Upgrade -Zeit ist:" + new Date (). Tolocalestring ()); } method.invoke (Gameplayer, args); null zurückkehren; }}} public class test {public static void main (String [] args) { /** Normaler statischer Proxy: Der Client kennt das Proxy -Objekt nicht, und das Proxy -Objekt vervollständigt seinen Funktionsaufruf* / igameplayer proxy = new GameplayerProxy ("x"); System.out.println ("Startzeit ist:" + neues Datum (). Tolocalestring ()); Proxy.login ("Zhangsan", "ABCD"); Proxy.Killboss (); Proxy.Upgrade (); System.out.println ("Endzeit ist:" + neues Datum (). Tolocalestring ()); System.out.println (); /** Das Proxy -Objekt verbessert die Funktion des Proxy -Objekts*/ igameplayer proxy2 = neuer GameplayerProxy2 ("m"); proxy2.login ("lisi", "efg"); Proxy2.Killboss (); Proxy2.Upgrade (); System.out.println (); /** Dynamischer Proxy: Verwenden Sie den von JDK bereitgestellten InvocationHandler, um die Methode zum Aufrufen des Proxy-Objekts zu widerspiegeln. (Benachrichtigung) * In GameplayerProxy3 ist es die Benachrichtigungsstartzeit, in der die Methode als Anmeldung bezeichnet wird, und die Benachrichtigungsendzeit, in der das Upgrade */ GameplayerProxy3 Dynamic = New GameplayerProxy3 (neuer Gameplayer ("Y")); Igameplayer dynamicPlayer = dynamic.getProxy (); DynamicPlayer.login ("Wangwu", "1234"); dynamicPlayer.killboss (); DynamicPlayer.Upgrade (); /** Bearbeitungsorientiert: An vielen Orten muss eine ähnliche Geschäftslogik hinzugefügt werden, damit wir sie in den Abschnitt extrahieren können. Dies ist der Transaktionsabschnitt wie Protokollabschnitt, Berechtigungsabschnitt, Geschäftsabschnitt*/}} Drucken:
Die Startzeit ist: 2014-10-8 17:19:05 Login-Rolle X mit Zhangsan ist erfolgreich angemeldet! X kämpft gegen Monster! X wurde auf ein anderes Level verbessert! Die Endzeit ist: 2014-10-8 17:19:05 Die Anmeldezeit ist: 2014-10-8 17:19:05 Login-Rolle M mit dem Namen, den Lisi erfolgreich angemeldet ist! M kämpft gegen Monster! M wurde auf ein anderes Level verbessert! Die Upgrade-Zeit ist: 2014-10-8 17:19:05 Ich bin ein Proxy-Spieler. Der Charakter, den ich spiele, ist jemand anderes, und ich kann ihn dynamisch weitergeben, um mich anzumelden. Die Zeit ist: 2014-10-8 17:19:05 Der Logincharakter y mit dem Namen Wangwu wurde erfolgreich angemeldet! Y kämpft gegen Monster! Die Upgrade-Zeit ist: 2014-10-8 17:19:05 Y wurde auf ein anderes Level aufgerüstet!
Vorteil
(1) Die Rolle klarer Verantwortung besteht darin, die tatsächliche Geschäftslogik zu realisieren, und Sie müssen sich nicht um andere nicht verantwortungslose Angelegenheiten kümmern. Sie können eine Transaktion über einen späteren Agenten abschließen. Das dazugehörige Ergebnis ist prägnant und ein klares Programmieren.
(2) Das Proxy -Objekt kann als Vermittler zwischen dem Client und dem Zielobjekt fungieren, das eine Rolle spielt und das Zielobjekt schützt.
(3) hohe Skalierbarkeit