conceito
Modo proxy: o modo proxy é na verdade uma classe de proxy extra para executar algumas operações no objeto original. Por exemplo, às vezes precisamos contratar um advogado quando formos a uma ação, porque os advogados têm experiência em lei e podem operar e expressar nossas idéias para nós. É isso que a agência significa. O modo proxy é dividido em duas categorias: 1. Proxy estático (não usando os métodos no JDK); 2. Proxy dinâmico (usando o InvocationHandler e o proxy no JDK).
O proxy estático é criado por programadores ou ferramentas para gerar código -fonte da classe proxy e, em seguida, compilar a classe Proxy. A chamada estática significa que o arquivo bytecode da classe Proxy já existe antes que o programa seja executado, e o relacionamento entre a classe Proxy e a classe Delegate é determinado antes de ser executado.
O código -fonte da classe de proxy dinâmico é gerado dinamicamente pela JVM de acordo com a reflexão e outros mecanismos durante a operação do programa, para que não haja arquivo bytecode da classe proxy. A relação entre a classe de proxy e a classe Delegate é determinada quando o programa está em execução.
Exemplo
Aqui damos um exemplo de proxy estático:
Diagrama de classe:
/ *** interface do jogador**/ interface pública igameplayer {// efetuar login no jogo public void login (usuário da string, senha da string); // Mate monstros, a principal característica dos jogos online public void killboss (); // atualizar public void upgrade (); } / *** Gamer**/ classe pública GamePlayer implementa o iGamePlayer {private String name = ""; // Passe o nome através do jogo público do construtor (String _name) {this.name = _name; } // Ao lutar contra monstros, o mais esperado é matar o antigo monstro public void killboss () {System.out.println (this.name + "mata monstros!"); } // Você deve fazer login antes de entrar no jogo. Esta é uma condição necessária. public void login (usuário da string, senha da string) {System.out.println ("Nome do login é" + user + "função" + this.name + "login com sucesso!"); } // Upgrade, existem muitas maneiras de atualizar, gastar dinheiro para comprar e executar tarefas também é um tipo de atualização pública de vazio () {System.out.println (this.name + "outro nível!"); }} /*** O cliente não é visível para o objeto de proxy*/classe pública GamePlayerProxy implementa o iGamePlayer {GamePlayer privado igamePlayer = null; // proxy object // passa pelo construtor para quem praticar o jogo público (string username) {this.gamePlayer = } // Destinatário para matar monstros public void killboss () {this.gameplayer.killboss (); } // Destinatário do login public void Login (String User, String senha) {this.gameplayer.login (usuário, senha); } // Pratique upgrade public void upgrade () {this.gameplayer.upgrade (); }} /** O cliente não é visível para o objeto proxy*/classe pública GamePlayerProxy2 implementa o iGameplayer {private igameplayer gameplayer = null; // proxy objeto // passa pelo construtor a quem praticar o jogo público -playerProxy2 (string username) {this.gamePlayPlayer = a playerplayer em string (this.gamePlayPlayer; } // RECENDIENTE Mate monstros public void killboss () {this.gameplayer.killboss (); } // Login do receptor Public void Login (Usuário da String, String senha) {System.out.println ("localEstring ()"); this.gameplayer.login (usuário, senha); } // prática upgrade () public void upgrade () {this.gameplayer.upgrade (); System.out.println ("O tempo de atualização é:" + new Date (). Tolocalestring ()); }} /** O cliente não é visível para o objeto proxy*/ Public Class GamePlayerProxy3 {jogador de jogo privado do iGamePlayer; // Passe o objeto Proxy (Proxy) através do jogo público do construtor Public GamePlayerProxy3 (jogo de jogo do iGamePlayer) {this.gameplayer = GamePlayer; System.out.println ("Eu sou um proxy, o personagem que interpreto é de outra pessoa e pode ser passado dinamicamente"); } public igameplayer getProxy () {return (igameplayer) proxy.newproxyInstance (this.getclass (). getclassloader (), nova classe [] {igameplayer.class}, newInvocationHandler ()); } classe privada myInvocationHandler implementa InvocationHandler {@Override public Object Invoke (proxy do objeto, método do método, objeto [] args) lança arremesso {if (method.getName (). Equals ("login")) {System.out.println ("localestring ()"); } if (métod.getName (). Equals ("Upgrade")) {System.out.println ("O tempo de atualização é:" + new Date (). tolocalestring ()); } métod.invoke (jogador, args); retornar nulo; }}} Public class Test {public static void main (string [] args) { /** Proxy estática normal: o cliente não conhece o objeto Proxy, e o objeto Proxy completa sua chamada de função* / igameplayer proxy = new GamePlayerProxy ("x"); System.out.println ("O horário de início é:" + new Date (). Tolocalestring ()); proxy.login ("Zhangsan", "ABCD"); proxy.killboss (); proxy.upgrade (); System.out.println ("Hora do final é:" + new Date (). Tolocalestring ()); System.out.println (); /** O objeto Proxy aprimora a função do objeto proxy*/ igameplayer proxy2 = new GamePlayerProxy2 ("M"); proxy2.login ("lisi", "efg"); proxy2.killboss (); proxy2.upgrade (); System.out.println (); /** Proxy dinâmico: use o InvocationHandler fornecido pelo JDK para refletir o método de chamar o objeto proxy* combinado com java.reflect.proxy para gerar objetos de proxy* Dynamicamente o objeto de proxy (o objeto de proxy pode ser o que pode ser o que pode ser aprimorado (o objeto de proxy) ou que as funções (o objeto de proxy podem ser aprimoradas quando serem aprimoradas quando as funções (o objeto de proxy podem ser aprimoradas quando serem aprimoradas quando as funções do proxy; executado (notificação) * Na jogabilidadeProxy3, é o horário de início da notificação em que o método é chamado de login e o horário de notificação no final da atualização */ GamePlayerProxy3 Dynamic = New GamePlayerProxy3 (novo GamePlayer ("Y")); Igameplayer dynamicplayer = dynamic.getproxy (); DynamicPlayer.login ("Wangwu", "1234"); Dynamicplayer.killboss (); dynamicplayer.upgrade (); /** Orientado por edição: alguma lógica de negócios semelhante precisa ser adicionada a muitos lugares, para que possamos extraí-la para a seção, que é a seção de transações: como seção de log, seção de permissão, seção de negócios*/}} Imprimir:
O horário de início é: 2014-10-8 17:19:05 A função de login x com Zhangsan está conectada com sucesso! X está lutando contra monstros! X foi atualizado para outro nível! O horário de término é: 2014-10-8 17:19:05 O tempo de login é: 2014-10-8 17:19:05 A função de login M com o nome Lisi está conectada com sucesso! M está lutando contra monstros! M foi atualizado para outro nível! O horário da atualização é: 2014-10-8 17:19:05 Eu sou um jogador de proxy. O personagem que interpreto é de outra pessoa, e posso passar dinamicamente para fazer login. O tempo é: 2014-10-8 17:19:05 O personagem de login y com o nome Wangwu foi conectado com sucesso! Y está lutando contra monstros! O horário de atualização é: 2014-10-8 17:19:05 Y foi atualizado para outro nível!
vantagem
(1) O papel das responsabilidades claras é realizar a lógica de negócios real e você não precisa se preocupar com outros assuntos não responsáveis. Você pode concluir uma transação através de um agente posterior. O resultado que o acompanha é uma programação concisa e clara.
(2) O objeto proxy pode atuar como um intermediário entre o cliente e o objeto de destino, que desempenha uma função e protege o objeto de destino.
(3) alta escalabilidade