Tous les agents savent que lorsque vous faites du shopping, il y a beaucoup d'agents et ils vendent simplement des produits d'origine. Par exemple, si vous voulez acheter de la viande tous les jours, le cochon est élevé par l'agriculteur, mais si vous achetez de la viande au boucher, le boucher peut être considéré comme un agent. Alors pourquoi avez-vous besoin d'un agent? Les porcs et les massacreront.
Comment mettre en œuvre ce processus avec le code: nous devons utiliser trois catégories: Butcher et agriculteur pour vous référer respectivement à vous, Butcher et les agriculteurs. Parmi eux, l'agriculteur fournit également une méthode pour acheter de la viande pour appeler le boucher.
La copie de code est la suivante:
classement de classe {
public int BuyMeat (int argent) {
int viande = 0;
// ... viande = ***;
retourner la viande;
}
}
Le boucher vous fournit une méthode pour acheter de la viande. Le code est le suivant:
La copie de code est la suivante:
classe Butcher {
public int BuyMeat (int argent) {
Farmer Farmer = New Farmer ();
int viande = agriculteur.umemat (argent);
viande + = 5; // 3. injecter 5 livres d'eau dans la viande, donc le poids augmentera.
Retour à la viande; // 4.Return à vous.
}
}
Cependant, le code que vous achetez de la viande au Butcher se ressemble:
La copie de code est la suivante:
classe vous {
Public Void Work () {
int youmoney = 10;
Butcher Butcher = new Butcher (); // trouver un boucher.
int viande = Butcher.uyMeat (youmoney);
System.out.println ("Cuire la viande, le poids:" + viande); // Vous l'avez cuit.
}
}
Nous pouvons également optimiser ce programme. C'est un boucher ou un fermier.
La copie de code est la suivante:
classe vous {
Public Void Work () {
int youmoney = 10;
Peldar peldar = new Butcher ();
int viande = peldar.uymeat (youmoney);
System.out.println ("Cuire la viande, le poids:" + viande);
}
}
interface peldar {
int BuyMeat (int argent);
}
classe Butcher implémente Peldar {
@Outrepasser
public int BuyMeat (int argent) {
Farmer Farmer = New Farmer ();
int viande = agriculteur.umemat (argent);
viande + = 5; // 3. injecter 5 livres d'eau dans la viande, donc le poids augmentera.
Retour à la viande; // 4.Return à vous.
}
}
La classe agricole implémente Peldar {
@Outrepasser
public int BuyMeat (int argent) {
int viande = 0;
// ... viande = ***;
retourner la viande;
}
}
C'est le proxy.
Cependant, cela s'appelle Static Proxy, car la classe de proxy (classe Butcher) est écrite par vous, et le proxy dynamique est de générer dynamiquement une classe de proxy équivalente lorsque Java est en cours d'exécution. Bien que la classe soit générée dynamiquement, le code pour tuer des porcs et injecter de l'eau doivent encore être écrits, n'écrivez plus une classe. Où l'écrire?
La copie de code est la suivante:
Interface publique InvocationHandler {
L'objet public invoque (proxy d'objet, méthode de la méthode, objet [] args) lance Throwsable;
}
Que signifient les paramètres?
La copie de code est la suivante:
Interface publique InvocationHandler {
L'objet public invoque (objet Butcher, méthode buymeat, objet [] argent) lance le jetable;
}
Le premier paramètre est un objet de la classe proxy générée automatiquement (un objet de la classe Butcher générée automatiquement), et le deuxième paramètre est l'objet de la méthode appelée (comment la méthode a-t-elle des objets, voir le java Mécanisme de réflexion). Ainsi, le code pour tuer des porcs et remplir de l'eau devient ainsi quand il est écrit:
La copie de code est la suivante:
InvocationHandler minvocationhandler = new invocationhandler () {
@Outrepasser
invoque d'objet public (boucher d'objet, méthode buymeat, objet [] args) lance throwable {
Farmer Farmer = New Farmer ();
int viande = (entier) buymeat.invoke (agriculteur, args);
viande + = 5; // 3. injecter 5 livres d'eau dans la viande, donc le poids augmentera.
Retour à la viande; // 4.Return à vous.
}
};
Ceci est un peu incompatible avec la méthode conventionnelle pour appeler la méthode d'achat de la viande de l'agriculteur. Vous pouvez demander alors pourquoi ne pas l'appeler directement? Vous avez de nombreux objets d'agriculteurs, même pas des objets d'agriculteurs, peuvent être utilisés comme une instance d'une certaine interface (que l'interface est spécifiée ci-dessous, le nommez d'abord), et peut être transmis en tant que paramètres, puis la méthode l'appelle. Voyons maintenant comment générer une classe de proxy.
La copie de code est la suivante:
Objet statique public NewProxyInstance (Classloader Loader, classe <?> [] Interfaces, invocationHandler h)
lance illégalargumentException
Expliquez les paramètres. est une interface, et il est nouvellement généré. Dans le tableau, et l'appel mentionné dans le paragraphe précédent est le problème de l'échec est également clair. Le troisième paramètre, InvocationHandler, est mieux compris, c'est-à-dire que toute méthode de la classe proxy est appelée, l'invocationHandler sera informé. Le code complet est écrit ci-dessous:
La copie de code est la suivante:
classe vous {
Public Void Work () {
int youmoney = 10;
Peldar peldarproxy = (peldar) proxy.newproxyinstance (getClass (). GetClassLoader (), new class [] {peldar.class}, minvocationhandler);
int viande = peldarproxy.uymeat (youmoney);
System.out.println ("Cuire la viande, le poids:" + viande);
}
InvocationHandler minvocationhandler = new invocationhandler () {
@Outrepasser
Invoque d'objet public (boucher d'objet, méthode buymeat, objet [] args)
lance jetable {
Farmer Farmer = New Farmer ();
int viande = (entier) buymeat.invoke (agriculteur, args);
viande + = 5; // 3. injecter 5 livres d'eau dans la viande, donc le poids augmentera.
Retour à la viande; // 4.Return à vous.
}
};
}
interface peldar {
int BuyMeat (int argent);
}
La classe agricole implémente Peldar {
@Outrepasser
public int BuyMeat (int argent) {
int viande = 0;
// ... viande = ***;
retourner la viande;
}
}
Ici, une classe proxy est générée dans la classe You.