Das Verständnis und die Verwendung von Entwurfsmustern kann unsere guten, objektorientierten Programmiergewohnheiten kultivieren, und in den tatsächlichen Anwendungen können wir den Spaß genießen, wohl zu sein.
Proxy ist ein relativ nützliches Modell, und es gibt viele Varianten. erklärt als: Vom Startpunkt bis hin zu einer Zwischenschicht zwischen den Zielen, was bedeutet Agent.
Definiert im Designmuster: Bietet einen Proxy für andere Objekte, um den Zugriff auf dieses Objekt zu steuern.
Warum den Proxy -Modus verwenden?
1. Autorisierungsmechanismus Benutzer von Autorisierungsebenen haben unterschiedliche Zugriffsrechte für dasselbe Objekt. (Nicht registrierte Benutzer) und in Jive können Sie die Zugriffsrechte dieser beiden Benutzer durch einen Proxy -ähnlichen ForumProxy zum Forum steuern.
2. Ein Client kann nicht direkt an ein Objekt arbeiten, sondern muss mit diesem Objekt interagieren.
Geben Sie zwei spezifische Beispiele an:
1. Wenn das Objekt ein großes Bild ist und es lange dauert, bis das Bild im Dokument enthalten ist, verwenden Sie den Editor oder Browser, um das Dokument zu öffnen, und das Dokument muss sehr schnell geöffnet werden und kann nicht warten .
2. Wenn sich dieses Objekt auf einem Remote -Server im Internet befindet und dieses Objekt direkt betreibt, kann dies aufgrund der Netzwerkgeschwindigkeit langsam sein, dann können wir Proxy verwenden, um dieses Objekt zuerst zu ersetzen.
Kurz gesagt, das Prinzip ist, dass sie für Objekte mit hohem Overhead nur dann erstellt werden. Daher glauben einige Leute, dass Java das Ressourcengedächtnis verbraucht, und ich denke, das hat etwas mit der Programmierungsidee zu tun.
So verwenden Sie den Proxy -Modus
Wenn Sie das Jive -Forum -System als Beispiel übernehmen, gibt es viele Arten von Benutzern, die das Forum -System besuchen: registrierte normale Benutzer, Forum Manager, Systemmanager und Touristen. Nur durch die Registrierung eines normalen Benutzer können Forum -Manager ihre autorisierten Foren verwalten, und Systemmanager können alle Transaktionen usw. verwalten. Diese Berechtigungsabteilung und -verwaltung werden mit Proxy abgeschlossen.
Forum ist die Kernschnittstelle von Jive.
Benutzer mit verschiedenen Berechtigungsebenen sind in Forumpermissions definiert:
Die Codekopie lautet wie folgt:
Forumpermissions für öffentliche Klasse implementiert zwischengespeichert {{
/**
* Erlaubnis zum Lesen von Objekt.
*/
öffentliche statische endgültige int read = 0;
/**
* Erlaubnis zum Administrator das gesamte System.
*/
public static final int system_admin = 1;
/**
* Erlaubnis, ein bestimmtes Forum zu Administrator.
*/
öffentliches statisches Final INT -Forum_Admin = 2;
/**
* Erlaubnis an Administrator eines bestimmten Benutzers.
*/
public static final int user_admin = 3;
/**
* Erlaubnis, eine bestimmte Gruppe zu Administrator.
*/
public static final int Group_Admin = 4;
/**
* Erlaubnis zur Moderne von Themen.
*/
public static final int moderate_threads = 5;
/**
* Erlaubnis, einen neuen Thread zu erstellen.
*/
public static final int create_thread = 6;
/**
* Erlaubnis, eine neue Nachricht zu erstellen.
*/
public static final int create_message = 7;
/**
* Erlaubnis zu modernen Nachrichten.
*/
public static final int moderate_messages = 8;
.....
public boolean issystemorforumAdmin () {
return (values [forum_admin] || Werte [System_Admin]);
}
.....
}
Daher beziehen sich verschiedene Betriebsberechtigungen im Forum mit der von ForumPermissionen definierten Benutzerebene. Wenn Sie beispielsweise den Namen des Forums ändern, kann der Code wie folgt nur der Forum Manager oder System Manager ändern:
Die Codekopie lautet wie folgt:
öffentliches KlassenforumProxy implementiert Forum {
private Forumpermissions Berechtigungen;
Privatforum Forum;
this.Authorization = Autorisierung;
öffentliches Forumproxy (Forum Forum, Autorisierung der Autorisierung,
Forumpermissions -Berechtigungen) {
this.forum = Forum;
this.Authorization = Autorisierung;
this.Permissions = Berechtigungen;
}
.....
public void setName (String -Name) löst nicht autorisierte Ausnahme aus,
ForumalreadyExistsexception {
// Nur das System oder das Forum Administrator kann den Namen if (Berechtigungen.ISSYSTEMORFORUMADMIN ()) {) {
Forum.SetName (Name);
}
anders {
neue unbefugte Ausnahme () werfen;
}
}
...
}
DBForum ist die tatsächliche Implementierung des Schnittstellenforums.
Die Codekopie lautet wie folgt:
öffentliche Klasse DBForum implementiert Forum, zwischengespeichert {
...
public void setName (String -Name) löst ForumalReadyExistsexception {aus
....
this.name = name;
// Hier speichern Sie den neuen Namen wirklich in der Datenbank in Savetodb ();
....
}
...
}
Immer wenn das Forum -Name geändert wird, müssen sich andere Programme zuerst mit ForumProxy befassen.
In den täglichen Anwendungen ist es unvermeidlich, dass das Systemautorisierungs- oder Sicherheitssystem immer beteiligt ist.
Lassen Sie uns weiterhin in Kombination mit Jive tiefer sprechen, und das Werksmodell wird unten involviert sein.
Wir wissen bereits, dass die Verwendung von ForumProxy die Verwendung eines Forums in Jive zur Verwendung des Fabrikmusters erfordert, und es gibt ein totales abstraktes ForumFactory. Singleton wird hier verwendet (auch eines der Entwurfsmuster), GetInstance () return ForumFactoryProxy.
Warum nicht ForumFactory zurückgeben, aber ForumFactory Implementation ForumFactoryProxy zurückgeben? Der Grund ist offensichtlich, und es ist notwendig zu bestimmen, ob das Forum die Erlaubnis hat, es über den Proxy zu erstellen.
In ForumFactoryProxy sehen wir den Code wie folgt:
Die Codekopie lautet wie folgt:
öffentliches Klasse ForumFactoryProxy erweitert ForumFactory {
geschützte ForumFaktorische Fabrik;
geschützte Autorisierungserlaubnis;
Schutzberechtigungen;
public forumfactoryProxy (Autorisierungsautorisierung, ForumFactory Factory, Forumpermissions -Berechtigungen) {
this.factory = factory;
this.Authorization = Autorisierung;
this.Permissions = Berechtigungen;
}
öffentliches Forum createForum (Zeichenfolge Name, Zeichenfolge Beschreibung)
wirft nicht autorisierte Ausnahme, Forumalreadysexistsexception {
// Nur Systemadministratoren können Forum erstellen
if (formulions.get (forumpermissions.system_admin)) {
Forum Newforum = factory.createForum (Name, Beschreibung);
Return New ForumProxy (Newforum, Autorisierung, Berechtigungen);
}
anders {
neue unbefugte Ausnahme () werfen;
}
}
}
Die Methode createForum gibt ForumProxy zurück.
Beachten Sie, dass es hier zwei Proxy gibt: ForumProxy und ForumFactoryProxy. Repräsentiert zwei verschiedene Verantwortlichkeiten: Verwenden von Forum und Erstellen von Forum. Was die Verwendung von Objekten vom Erstellen von Objekten getrennt ist, wird das Fabrikmuster verwendet: Es gilt für "Kapselung" und "Versand". Mit anderen Worten, die Funktionen sind so einzeln wie möglich, um die Wartung und Änderung zu erleichtern.
Andere Posterstellung und -nutzung im Jive Forum -System basieren auf der Forum -Idee.
Oben haben wir diskutiert, wie der Proxy für den Zugriff auf den Autorisierungsmechanismus verwendet wird. Das Kopieren eines riesigen und komplexen Objekts ist ein sehr teurer Betrieb. Verwenden Sie einen Proxy, um diesen Kopierprozess zu verzögern.
Zum Beispiel: Wir haben eine große Sammlung wie Hashtable, und viele Kunden werden gleichzeitig gleichzeitig darauf zugreifen. Einer der speziellen Kunden muss eine kontinuierliche Datenerfassung durchführen, und zu diesem Zeitpunkt müssen andere Kunden die Hashtable nicht mehr hinzufügen oder löschen.
Die direkteste Lösung ist: Verwenden Sie das Sammelschloss, lassen Sie diesen speziellen Client diese Sperre erhalten, die kontinuierliche Datenerfassung durchführen und dann die Sperre freigeben.
Die Codekopie lautet wie folgt:
public void fofetches (Hashtable ht) {
synchronisiert (ht) {
// spezifische Maßnahmen zur kontinuierlichen Datenerfassung ...
}
}
Diese Methode kann jedoch die Sammlung lange sperren, und andere Kunden können in diesem Zeitraum nicht auf die Sammlung zugreifen.
Die zweite Lösung besteht darin, die Sammlung zu schließen und dann die kontinuierlichen Daten den Sammelvorgang für den Klon zu erhalten. Diese Lösung basiert auf der Tatsache, dass die Sammlung klonbar ist und es eine Methode zur Bereitstellung eines tiefen Klons geben muss. Hashtabelle bietet eine eigene Klonmethode, jedoch nicht den Klon der Schlüssel- und Wertobjekte.
Die Codekopie lautet wie folgt:
public void fofetches (Hashtable ht) {
Hashttable newht = (Hashtable) ht.clone ();
}
Das Problem kommt erneut.
Die endgültige Lösung: Wir können warten, bis andere Clients vor dem Klonen geändert haben, dh dieser spezielle Client führt zunächst eine Reihe von Datenerfassungsvorgängen durch, indem sie eine Methode namens Clone aufrufen. Tatsächlich wurde jedoch tatsächlich kein Objektkopieren durchgeführt, bis andere Clients die Objektsammlung ändern.
Implementieren Sie diese Lösung mit Proxy, bei dem es sich um den Kopier-auf-Schreiben-Betrieb handelt.
Proxy verfügt über eine breite Palette von Anwendungen.