Alle Agenten wissen, dass es beim Einkaufen viele Agenten gibt und sie nur Originalprodukte verkaufen. Wenn Sie beispielsweise jeden Tag Fleisch kaufen möchten, wird das Schwein vom Landwirt angehoben. Wenn Sie jedoch Fleisch beim Metzger kaufen, kann der Metzger als Agent angesehen werden. Warum brauchen Sie dann einen Agenten? Schweine und dann, wenn Sie es Ihnen verkaufen, kann der Metzger das Fleisch mit etwas Wasser füllen.
So implementieren Sie diesen Prozess mit Code: Wir sollten drei Kategorien verwenden: Metzger und Landwirt, um sich auf Sie, Metzger und Landwirte zu beziehen. Unter ihnen bietet der Landwirt auch eine Methode, um Fleisch zu kaufen, um den Metzger zu nennen.
Die Codekopie lautet wie folgt:
Klassenbauer {
public int buymeat (int Money) {
int fleisch = 0;
// ... fleisch = ***;
Fleisch zurückgeben;
}
}
Der Metzger bietet Ihnen eine Methode, um Fleisch zu kaufen. Der Code ist wie folgt:
Die Codekopie lautet wie folgt:
Klasse Butcher {
public int buymeat (int Money) {
Farmer Farmer = New Farmer ();
int fleisch = Farmer.buymeat (Geld);
Fleisch += 5;
Fleisch zurückgeben;
}
}
Der Code, den Sie aus dem Metzger kaufen, wird jedoch wie folgt:
Die Codekopie lautet wie folgt:
Klasse Sie {
public void work () {
int YouMoney = 10;
Metzgerin = neuer Butcher ();
int fleisch = butcher.buymeat (YouMoney);
System.out.println ("das Fleisch kochen, Gewicht:" + Fleisch); // Sie haben es gekocht.
}
}
Wir können dieses Programm auch optimieren. Es ist ein Metzger oder ein Landwirt.
Die Codekopie lautet wie folgt:
Klasse Sie {
public void work () {
int YouMoney = 10;
Peldar Peldar = New Butcher ();
int fleisch = peldar.buymeat (YouMoney);
System.out.println ("das Fleisch kochen, Gewicht:" + Fleisch);
}
}
Schnittstellenpeldar {
int buymeat (int Money);
}
Klasse Butcher implementiert Peldar {
@Override
public int buymeat (int Money) {
Farmer Farmer = New Farmer ();
int fleisch = Farmer.buymeat (Geld);
Fleisch += 5;
Fleisch zurückgeben;
}
}
Klassenbauer implementiert Peldar {
@Override
public int buymeat (int Money) {
int fleisch = 0;
// ... fleisch = ***;
Fleisch zurückgeben;
}
}
Dies ist der Proxy.
Dies wird jedoch als statischer Proxy bezeichnet, da die Proxy -Klasse (Butcher -Klasse) von Ihnen geschrieben wurde und der dynamische Proxy darin besteht, eine äquivalente Proxy -Klasse dynamisch zu generieren, wenn Java ausgeführt wird. Obwohl die Klasse dynamisch erzeugt wird, muss der Code zum Töten von Schweinen und das Injizieren von Wasser noch geschrieben werden. Schreiben Sie einfach keine Klasse mehr. Wo schreiben Sie es?
Die Codekopie lautet wie folgt:
öffentliche Schnittstelle InvocationHandler {
öffentliches Objekt aufrufen (Object Proxy, Method -Methode, Objekt [] args) wirft Throwable ab;
}
Was bedeutet die Parameter?
Die Codekopie lautet wie folgt:
öffentliche Schnittstelle InvocationHandler {
öffentliches Objekt aufrufen (Objekt Butcher, Methode Buymeat, Objekt [] Geld) wirft Throwable ab;
}
Der erste Parameter ist ein Objekt der automatisch generierten Proxy -Klasse (ein Objekt der automatisch generierten Metzger -Klasse), und der zweite Parameter ist das Objekt der aufgerufenen Methode (wie hat die Methode Objekte, siehe Java, siehe Java Reflexionsmechanismus). Der Code zum Töten von Schweinen und das Füllen von Wasser wird also so, wenn es geschrieben ist:
Die Codekopie lautet wie folgt:
InvocationHandler minvocationHandler = new invocationHandler () {
@Override
öffentliches Objekt aufrufen (Objekt Butcher, Methode BuyMeat, Object [] args) wirft Throwable {aus
Farmer Farmer = New Farmer ();
int fleisch = (Ganzzahl) buymeat.invoke (Landwirt, Argumente);
Fleisch += 5;
Fleisch zurückgeben;
}
};
Dies ist ein wenig nicht mit der konventionellen Methode des Bauernfleisches überein. Sie können dann fragen, warum Sie es nicht direkt anrufen. Sie haben viele Landwirtobjekte, auch keine Landwirtobjekte, können als Instanz einer bestimmten Schnittstelle verwendet werden (welche Schnittstelle unten angegeben ist, lassen Sie es zuerst als Parameter übergeben und dann aufgerufen. Schauen wir uns nun an, wie Sie eine Proxy -Klasse generieren.
Die Codekopie lautet wie folgt:
öffentliches statisches Objekt NewProxyInstance (Classloader Loader, Klasse <?> [] Schnittstellen, InvocationHandler H)
wirft IllegalArgumentException aus
Erklären Sie die Parameter. ist eine Schnittstelle, und es wird neu erzeugt. Im Array ist auch der im vorherige Absatz erwähnte Anruf das Problem des Versagens. Der dritte Parameter, InvocationHandler, wird besser verstanden, dh, solange jede Methode in der Proxy -Klasse aufgerufen wird, wird der InvocationHandler benachrichtigt. Der vollständige Code ist unten geschrieben:
Die Codekopie lautet wie folgt:
Klasse Sie {
public void work () {
int YouMoney = 10;
Peldar peldarproxy = (peldar) proxy.newproxyinstance (getClass (). GetClassloader (), neue Klasse [] {Peldar.class}, minvocationHandler);
int fleisch = peldarproxy.buymeat (YouMoney);
System.out.println ("das Fleisch kochen, Gewicht:" + Fleisch);
}
InvocationHandler minvocationHandler = new invocationHandler () {
@Override
öffentliches Objekt aufrufen (Object Butcher, Methode Buymeat, Objekt [] Argumente)
wirft Throwable {
Farmer Farmer = New Farmer ();
int fleisch = (Ganzzahl) buymeat.invoke (Landwirt, Argumente);
Fleisch += 5;
Fleisch zurückgeben;
}
};
}
Schnittstellenpeldar {
int buymeat (int Money);
}
Klassenbauer implementiert Peldar {
@Override
public int buymeat (int Money) {
int fleisch = 0;
// ... fleisch = ***;
Fleisch zurückgeben;
}
}
Hier wird eine Proxy -Klasse in der You -Klasse generiert.