Duvidas Pattern Proxy

[quote=acidburn][quote=pedro.lamarao]Um bom exemplo de aplicação de Proxy para funcionalidade, ao invés de economia, ocorre em frameworks de “remoting”.
Como uma referência direta à memória de outro processo é impossível, o programa local faz referência a um objeto Proxy ao invés; e o Proxy oculta a solução para o problema de comunicação entre processos.

Qualquer objeto que está para um sistema externo – como um conector de banco de dados – pode ser considerado um Proxy do sistema externo no programa local.
Note que “proxy” é inglês para “procurador” – uma pessoa legalmente habilitada a agir em nome de outra.[/quote]

O que não consigo compreender é como você disse o Proxy é um procurador, porém nos exemplos que eu li, entendi que o proxy esta agindo como um intermediário em um determinado momento assim chamando uma classe para executar algo, como no exemplo a cima onde a classe proxy se não me engano é utilizada para realizar a consulta no banco me corrijam se estiver errado, mas qual a necessidade disso ? [/quote]

Talvez a questão não seja sobre necessidade, mas sobre utilidade.
É claro que um idéia de um Proxy puro parece inútil – se ele é idêntico ao objeto original, porque não acessar o objeto original logo de uma vez?
O Proxy parece mais útil quando ele oculta alguma regra adicional que seja útil.
No seu exemplo, essa regra adicional parece ser um cache de dados recuperados do banco – de modo que os acessos subsequentes são mais econômicos.

No proxy que você implementou, é pq o método getId() não aciona a busca. Como o id é passado no construtor e o proxy o armazena internamente, não tem pq fazer busca se você só quiser saber o id. Se fizer pessoa.get(2).getNome() aí sim, a busca será acionada.

No proxy que você implementou, é pq o método getId() não aciona a busca. Como o id é passado no construtor e o proxy o armazena internamente, não tem pq fazer busca se você só quiser saber o id. Se fizer pessoa.get(2).getNome() aí sim, a busca será acionada.[/quote]

a então é isso mesmo

System.out.println("Nome: " + pessoas.get(0).getNome()); // busca do banco de dados System.out.println("Nome: " + pessoas.get(1).getNome()); // busca do banco de dados System.out.println("Nome: " + pessoas.get(0).getNome()); // já buscou esta pessoa... apenas System.out.println("Id da 3ª - " + pessoas.get(2).getId());//pode imprimir o ID do objeto, e o proxy nao será inicializado.

Por que na busca da segunda pessoa ele alega estar no cache, é por que o objeto proxy vai estar carregado com dados?

Sim. E num segundo getNome() ele não buscará nada no banco.

Isto mesmo, acidbun, então ele não buscará pois fará o cache desta busca…