Definition:
Stellen Sie einen Ersatz oder Platzhalter für ein anderes Objekt bereit, um den Zugriff darauf zu steuern.
Stellen Sie einen Proxy für andere Objekte bereit, um den Zugriff auf dieses Objekt zu steuern.
Allgemeine Beschreibung:
Enthält im Allgemeinen drei Rollen: abstraktes Thema, konkretes Thema und Agententhema.
Abstraktes Thema: Es handelt sich um eine abstrakte Klasse oder Schnittstelle und eine allgemeine Geschäftstypdefinition.
Spezifisches Thema: der spezifische Ausführer der Geschäftslogik
Agentenrolle: Verantwortlich für die Anwendung realer Rollen und delegiert alle durch abstrakte Themenklassen definierten Methodenbeschränkungen zur Implementierung an reale Themenrollen.
Allgemeines Klassendiagramm:
Allgemeiner Code:
package Proxy; //抽象主题类: public interface Subject { public void doSomething(); } package Proxy; //具体主题类 public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("业务逻辑..."); } } package Proxy; //代理主题类 public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } } package Proxy; //客户端 public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); } }
Vorteile:
1. Klare Verantwortlichkeiten
2. Hohe Erweiterung
Erweiterung des Proxy-Modus:
Gewöhnlicher Proxy:
Die spezifische Themenklasse ist für die hohe Ebene und das Spezifische transparent Das Thema wird in der Proxy-Themenklasse erstellt. Klasse
Code-Implementierung:
package GeneralProxy; public interface Subject { public void doSomething(); } package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在执行业务逻辑..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("无法创建被代理对象"); }else{ this.name = name; } } } package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); } } package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("张三"); proxy.doSomethaing(); } }
Erzwungener Proxy:
Sie müssen das Objekt der Proxy-Themenklasse erhalten, indem Sie auf das spezifische zugreifen Themenklasse, und verwenden Sie dann die Proxy-Themenklasse, um den Zugriff zu steuern
Code-Implementierung:
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy(); } package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在执行业务逻辑..."); }else{ System.out.println("请先访问代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } } } package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; } } package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("张三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); } }
Anwendungsszenario
In der realen Welt entspricht eine Sekretärin einem Agenten Der Chef hat eine Besprechung, er benachrichtigt die Mitarbeiter über die Besprechungszeit, arrangiert den Veranstaltungsort, räumt den Veranstaltungsort nach der Besprechung auf usw. Die Arbeit im Zusammenhang mit Besprechungen kann der Sekretärin überlassen werden, und der Chef muss nur an Besprechungen teilnehmen und tut dies auch muss diese Dinge nicht selbst tun. Auf die gleiche Weise kann das Proxy-Muster auch in unserer Programmierung verwendet werden, um eine Reihe von Codes zu entkoppeln, die mit unabhängiger Logik kombiniert werden. Beispielsweise kann der Protokollierungscode im Geschäftscode im Proxy ausgeführt werden. AOP von Spring ist eine typische dynamische Proxy-Anwendung.
Anwendungsformen des Proxy-Modus
(1) Remote-Proxy – kann die Tatsache verbergen, dass ein Objekt in einem anderen Adressraum existiert. Es ermöglicht dem Client außerdem, auf Objekte auf dem Remote-Computer zuzugreifen. Der Remote-Computer verfügt möglicherweise über eine bessere Rechenleistung und Verarbeitungsgeschwindigkeit und kann schnell auf Client-Anfragen reagieren und diese verarbeiten.
(2)Virtueller Proxy – Ermöglicht die Erstellung von Objekten mit großem Speicheraufwand bei Bedarf. Erstellen Sie dieses Objekt nur, wenn wir es wirklich brauchen.
(3) Copy-On-Write-Proxy – Wird verwendet, um das Kopieren von Objekten zu steuern, indem das Kopieren von Objekten verzögert wird, bis der Client es wirklich benötigt. Ist eine Variante des virtuellen Agenten.
(4)Protection (Access)Proxy) – Bietet unterschiedliche Zugriffsebenen auf Zielobjekte für verschiedene Kunden
(5) Cache Proxy – Bietet temporäre Speicherung für teure Berechnungsergebnisse, wodurch mehrere Clients Ergebnisse gemeinsam nutzen können, um sie zu reduzieren Rechen- oder Netzwerklatenz.
(6) Firewall-Proxy – Kontrolliert den Zugriff auf Netzwerkressourcen und schützt Themes vor böswilligen Clients.
(7)SynchronizationProxy – Bietet sicheren Zugriff auf Themen in Multithread-Situationen.
(8) Smart ReferenceProxy – Wenn auf ein Objekt verwiesen wird, werden einige zusätzliche Vorgänge bereitgestellt, z. B. die Aufzeichnung der Anzahl der Aufrufe dieses Objekts.
(9) Complexity HidingProxy – Wird verwendet, um die Komplexität einer komplexen Sammlung einer Klasse zu verbergen und eine Zugriffskontrolle durchzuführen. Manchmal wird es auch Fassaden-Proxy genannt, was nicht schwer zu verstehen ist. Der komplexe versteckte Proxy unterscheidet sich vom Fassadenmuster, da der Proxy den Zugriff steuert, während sich das Fassadenmuster dadurch unterscheidet, dass der Proxy den Zugriff steuert, während das Fassadenmuster lediglich einen anderen Satz von Schnittstellen bereitstellt.
Weitere Beispiele zur Erläuterung der Verwendung des Proxy-Musters in der Java-Designmusterprogrammierung finden Sie auf der chinesischen PHP-Website für verwandte Artikel!