Todos os agentes sabem que quando você vai às compras, existem muitos agentes e eles apenas vendem produtos originais. Por exemplo, se você deseja comprar carne todos os dias, o porco será criado pelo fazendeiro, mas se você comprar carne do açougueiro, o açougueiro poderá ser considerado um agente. Então, por que você precisa de um agente? Qual é o uso de um agente? Porcos e depois abate -os.
Como implementar esse processo com o código: devemos usar três categorias: açougueiro e agricultor para se referir a você, açougueiro e agricultores, respectivamente. Entre eles, o agricultor também fornece um método para comprar carne para ligar para o açougueiro.
A cópia do código é a seguinte:
Classe Farmer {
public int BuyMeat (Int Money) {
int carne = 0;
// ... carne = ***;
retornar carne;
}
}
O açougueiro fornece um método para comprar carne. O código é o seguinte:
A cópia do código é a seguinte:
classe Butcher {
public int BuyMeat (Int Money) {
Agricultor = New Farmer ();
int meat = agricultor.buymeat (dinheiro);
Carne += 5;
devolver carne;
}
}
No entanto, o código que você compra carne do açougueiro se torna assim:
A cópia do código é a seguinte:
classe você {
public void Work () {
int youmoney = 10;
Butcher Butcher = New Butcher ();
int meat = butcher.buymeat (youmoney);
System.out.println ("Cozinhe a carne, peso:" + carne); // Você cozinhou.
}
}
Também podemos otimizar este programa. É um açougueiro ou um fazendeiro.
A cópia do código é a seguinte:
classe você {
public void Work () {
int youmoney = 10;
Peldar Peldar = New Butcher ();
int meat = Peldar.buymeat (YouMoney);
System.out.println ("cozinhe a carne, peso:" + carne);
}
}
Interface Peldar {
int compraMeat (INT Money);
}
classe Butcher implementa Peldar {
@Override
public int BuyMeat (Int Money) {
Agricultor = New Farmer ();
int meat = agricultor.buymeat (dinheiro);
Carne += 5;
devolver carne;
}
}
classe Farmer implementa Peldar {
@Override
public int BuyMeat (Int Money) {
int carne = 0;
// ... carne = ***;
retornar carne;
}
}
Este é o proxy.
No entanto, isso é chamado proxy estático, porque a classe de proxy (classe de açougueiro) é escrita por você, e o proxy dinâmico é gerar dinamicamente uma classe de proxy equivalente quando o Java está em execução. Embora a classe seja gerada dinamicamente, o código para matar porcos e injetar água ainda precisa ser escrito, não escreva mais uma aula. Onde escrever?
A cópia do código é a seguinte:
Public Interface InvocationHandler {
Public Object Invoke (proxy do objeto, método do método, objeto [] args) lança arremesso;
}
O que significa os parâmetros?
A cópia do código é a seguinte:
Public Interface InvocationHandler {
Objeto público Invoke (objeto Butcher, Método Buymeat, Object [] Money) lança arremesso;
}
O primeiro parâmetro é um objeto da classe proxy gerada automaticamente (um objeto da classe Butcher que é gerado automaticamente), e o segundo parâmetro é o objeto do método que está sendo chamado (como o método tem objetos, consulte o java Mecanismo de reflexão). Portanto, o código para matar porcos e encher água se torna assim quando é escrito:
A cópia do código é a seguinte:
InvocationHandler minvocationHandler = new InvocationHandler () {
@Override
Public Object Invoke (objeto Butcher, Método BuyMeat, Object [] args) lança jogável {
Agricultor = New Farmer ();
Int Meat = (Inteiro) BuyMeat.invoke (Farmer, Args);
Carne += 5;
devolver carne;
}
};
Isso é um pouco inconsistente com o método convencional de chamar o método de compra de carne do agricultor. Você pode perguntar então por que não chamar isso diretamente? Você tem muitos objetos de agricultores, mesmo não objetos de agricultores, podem ser usados como uma instância de uma determinada interface (cuja interface é especificada abaixo, vamos nomeá -lo primeiro) e pode ser passado como parâmetros e, em seguida, o método o chama. Agora, vamos dar uma olhada em como gerar uma aula de proxy.
A cópia do código é a seguinte:
Objeto estático público NewProxyInstance (Classloader carregador, classe <?> [] interfaces, InvocationHandler H)
lança ilegalArgumentException
Explique os parâmetros. é uma interface e é gerado recentemente. Na matriz, e a chamada mencionada no parágrafo anterior é o problema da falha também é clara. O terceiro parâmetro, InvocationHandler, é melhor compreendido, ou seja, desde que qualquer método na classe proxy seja chamado, o InvocationHandler será notificado. O código completo está escrito abaixo:
A cópia do código é a seguinte:
classe você {
public void Work () {
int youmoney = 10;
PELDAR PELDARPROXY = (PELDAR) proxy.NewProxyInstance (getClass (). GetClassLoader (), nova classe [] {Peldar.class}, minvocationHandler);
int carne = Peldarproxy.buymeat (YouMoney);
System.out.println ("Cozinhe a carne, peso:" + carne);
}
InvocationHandler minvocationHandler = new InvocationHandler () {
@Override
Public Object Invoke (objeto Butcher, Método BuyMeat, Object [] args)
lances lançáveis {
Agricultor = New Farmer ();
Int Meat = (Inteiro) BuyMeat.invoke (Farmer, Args);
Carne += 5;
devolver carne;
}
};
}
Interface Peldar {
int compraMeat (INT Money);
}
classe Farmer implementa Peldar {
@Override
public int BuyMeat (Int Money) {
int carne = 0;
// ... carne = ***;
retornar carne;
}
}
Aqui, uma classe proxy é gerada na aula de você.