Hinweise zu Java-Entwurfsmustern für Anfänger – Statischer Proxy oder Proxy-Muster

Proxy-Modus

 

1. Zweck:
Bereitstellung eines Proxys für andere Objekte, um den Zugriff auf dieses Objekt zu steuern.

(Stellen Sie ein Proxy-Objekt für ein Objekt bereit. Das Proxy-Objekt steuert die Referenz des spezifischen Objekts.)

 

2. Teilnehmer:

• Abstraktes Subjekt (Subject): Definiert die gemeinsame Schnittstelle zwischen dem realen Subjekt (Real Subject) und dem Proxy (Proxy) , sodass der Proxy (Proxy) überall dort verwendet werden kann, wo das reale Subjekt (Real Subject) verwendet wird .

• Echtes Subjekt: Definiert die durch den Proxy dargestellte Entität

• Proxy:

   1) Es enthält intern einen Verweis auf das Real Subject- Objekt, sodass das Real Subject- Objekt bedient werden kann.

   2) Gleichzeitig bietet das Proxy-Subjektobjekt (Proxy) dieselbe Schnittstelle zum abstrakten Subjekt (Subjekt) wie das reale Subjektobjekt (reales Subjekt) , sodass es jederzeit das reale Subjekt (reales Subjekt) ersetzen kann .

   3) Kontrollieren Sie den Bezug zum realen Subjekt (reales Subjekt) und übernehmen Sie bei Bedarf die Verantwortung für die Erstellung (oder Löschung) des realen Subjektobjekts.

   4) Gleichzeitig kann das Proxy- Objekt andere Vorgänge anhängen, wenn es Vorgänge am Real Subject- Objekt ausführt, anstatt den Aufruf einfach an das Real Subject- Objekt weiterzuleiten.

 

3. Struktur:



 

 

Persönlich denke ich, dass das Agentenmuster ein Designmuster ist, das leichter zu verstehen ist.

Oder verstehen Sie das Agenturmodell im wirklichen Leben.

Im wirklichen Leben hören wir oft das Wort Agent. Durch die Zusammenarbeit mit Agenten können Käufer bessere und mehr Dienstleistungen erhalten, und Verkäufer können sich auch auf die Produktion von Produkten konzentrieren, ohne mehr Energie für andere Dinge aufwenden zu müssen. Überlegen.

 

Nehmen wir als Beispiel den Kauf eines Autos. Wenn Sie im wirklichen Leben ein Auto von einem Verkäufer kaufen ( abstraktes Thema) , kaufen Sie es normalerweise nicht direkt beim Hersteller ( reales Thema) . Sie können zu einem 4S-Geschäft gehen ( Stellvertreterrolle ) Kaufen Sie ein Auto und erhalten Sie dort mehr Dienstleistungen.

 

Sehen wir uns an, wie es im Java-Code implementiert wird:

Verkäufer von Autos (abstraktes Thema):

/**
 * 抽象主题(Subject)
 * 
 * 汽车的销售商
 *
 */
public interface CarSeller {
	
	/*
	 * 销售汽车
	 */
	public Object sellCars(int type);

}

 

Audi-Hersteller (reales Thema):

/**
 * 真实主题(Real Subject)角色
 * 奥迪厂家
 *
 */
public class AudiCarFactory implements CarSeller {

	/*
	 * 实现了抽象主题(Subject)角色的方法
	 */
	public Object sellCars(int type) {
		System.out.println("奥迪工厂出售汽车。");
		if(type == 1){
			return "AudiA6";
		}else{
			return "AudiA8";
		}
	}

}

 

Autohändler (Agentur): 

**
 * 代理(Proxy)角色
 * 
 * 汽车代理商
 * (这个代理商销售的是奥迪汽车)
 *
 */
public class CarProxy implements CarSeller {
	
	private AudiCarFactory carFactory = new AudiCarFactory();
	
	/*
	 * 同样也实现了抽象主题(Subject)角色的方法
	 */
	public Object sellCars(int type) {
		
//		售前服务
		serveBeforeSell();
		
//		代理奥迪厂家来销售汽车
		Object car = carFactory.sellCars(type);
		System.out.println("由代理商从厂家取得客户需要的汽车");

//		售后服务
		serveAfterSell();
		
		return car;
	}
	
	protected void serveBeforeSell(){
		System.out.println("汽车代理商为客户提供了一些售前服务");
	}
	
	protected void serveAfterSell(){
		System.out.println("汽车代理商为客户提供了一些售后服务");
	}

}

 

Kunde (Kundenanruf):

/**
 * 客户端调用
 */
public class Customer {
	
	public static void main(String[] args){
		
//		顾客找到代理商
		CarSeller carSeller = new CarProxy();
		
//		由代理商来销售汽车,可以发现代理商在销售给顾客汽车时,为顾客提供了更多的其他服务
		Object car = carSeller.sellCars(1);
		System.out.println("顾客从代理商那里买了一辆" + car);
		
	}
}

 

Operationsergebnis:

汽车代理商为客户提供了一些售前服务
奥迪工厂出售汽车。
由代理商从厂家取得客户需要的汽车
汽车代理商为客户提供了一些售后服务
顾客从代理商那里买了一辆AudiA6

 

Welche Vorteile bietet das Agenturmodell?

Durch den Proxy-Modus wird ein Vermittler zwischen dem Client und dem realen Subjekt (Real Subject) hinzugefügt, der verhindert, dass der Client direkt auf das reale Subjekt (Real Subject) zugreift . Dies hat folgende Vorteile:

1) Wie im obigen Beispiel gezeigt, können einige zusätzliche Vorgänge vor oder nach dem Zugriff auf das eigentliche Thema hinzugefügt werden.

2) Möglichkeit, einige Zugangsdaten auszublenden;

3) Einige Kontrollen können hinzugefügt werden, um den Zugriff auf reale Themen zu ermöglichen, z. B. Sicherheitsüberprüfung usw.

 

Gemäß dem obigen Beispiel kann festgestellt werden, dass im Proxy-Muster die Rolle „Real Subject“ im Voraus vorhanden sein und als internes Attribut des Proxy- Objekts verwendet werden muss. Dies ist eigentlich der statische Proxy-Modus .

Im statischen Proxy-Modus wurde die Beziehung zwischen dem Proxy (Proxy) und dem realen Subjekt (Real Subject) vorab im Code definiert und ist festgelegt.

 

 

 Stellen Sie sich vor, ein Agent erweitert oder ändert die Art der von ihm vertretenen Produkte (zum Beispiel: Er fungiert als Agent für BMW-Autos).

1) Müssen Sie also die Proxy- Klasse ändern? Dies beeinträchtigt die Stabilität des bestehenden Systems.

2) Wenn Sie die vorhandene Proxy- Klasse nicht ändern , sondern eine neue Proxy-Klasse hinzufügen ( das Coderisiko beim Hinzufügen einer neuen Klasse ist viel geringer als beim Ändern des Codes einer vorhandenen Klasse ), stellen Sie sicher, dass die Rolle „Real Subject“ einem Proxy entspricht (Proxy-) Rolle, was zu einer starken Erweiterung der Klasse führen wird.

 

Diese enge Kopplung ist einer Systemerweiterung und Reaktion auf künftige Nachfrageänderungen nicht förderlich.

Gibt es also eine Möglichkeit, dass das System die Beziehung zwischen dem realen Subjekt (Real Subject) und dem Proxy (Proxy) nach Bedarf während der Laufzeit dynamisch binden kann?

Dynamic Proxy bietet eine Lösung, sieheHinweise zu Java-Entwurfsmustern für Anfänger – Dynamischer Proxy oder Proxy-Muster 

 

Ich denke du magst

Origin blog.csdn.net/louis_lee7812/article/details/83803450
Empfohlen
Rangfolge