O Padrão Proxy
325
11. O Padrão Proxy
Controlando o Acesso
aos Objetos
Você já brincou de tira bonzinho, tira malvado? Você
é o tira bonzinho e fornece todos os seus serviços de
maneira gentil e amigável, mas, como não quer que todo
mundo que solicitando esses serviços, você pede que o
tira malvado controle o acesso até você. Isto é o que os
proxies fazem: controlar e gerenciar o acesso. Como você
verá, um proxy dispõe de muitas maneiras para ajudar
os objetos que representa. Existem casos de proxies que
atravessaram toda a internet transportando chamadas
de métodos para os objetos representados; além disso,
sabe-se que eles costumam esperar pacientemente por
alguns objetos particularmente preguiçosos.
Com você como o meu
Proxy, posso triplicar o
valor do dinheiro do lanche
que costumo extorquir dos
meus amigos!
Como o cliente obtém o objeto stub?
CG_ucpadroes_RI2016.indb 325 22/11/2016 09:36:54
Use a Cabeça Padrões de Projetos
326
Parece bem fácil. Caso você ainda se lembre, nós já temos métodos no código da máquina de
goma para contar as gomas restantes (getCount()) e para determinar o estado atual (getState()).
Tudo o que resta fazer é criar um relatório que possa ser impresso e enviado para o presidente
da companhia. Hummm, talvez seja útil acrescentar também um campo informando a
localização da máquina, porque isto ajudará o presidente a manter um melhor controle das
suas máquinas.
Vamos entrar em ação imediatamente e gerar o código necessário. Queremos impressionar
o cliente com a rapidez da nossa resposta.
Codicando o Monitor
Começaremos acrescentando os itens necessários para que a classe GumballMachine consiga lidar com informações sobre a sua
localização:
public class GumballMachine {
// outras variáveis de instância
String location;
public GumballMachine(String location, int count) {
// restante do código do construtor aqui
this.location = location;
}
public String getLocation() {
return location;
}
//outros métodos aqui
}
Agora vamos criar outra classe, GumballMonitor, que recupera a localização da máquina, o número de gomas restantes e o estado
atual da máquina e imprime essas informações num pequeno e simpático relatório:
public class GumballMonitor {
GumballMachine machine;
public GumballMonitor (GumballMachine machine) {
this.machine = machine;
Lembra-se do presidente
da Goma Poderosa Ltda.?
Uma localização é
simplesmente um string.
Acrescentamos também um método
que nos permita recuperar esses
dados sempre que necessário.
A localização é passada para o
construtor e armazenada na
variável de instância.
O monitor recebe a máquina no
seu construtor e a atribui à
variável de instância “machine”.
Atenção, pessoal, eu realmente
gostaria de implantar um
monitoramento melhor nas minhas
máquinas de goma. Será que vocês
conseguiriam encontrar uma maneira
de gerar um relatório sobre o estoque
e o estado da máquina?
CG_ucpadroes_RI2016.indb 326 22/11/2016 09:36:54
O Padrão Proxy
327
}
public void report() {
System.out.println(“Gumball Machine: “ + machine.getLocation());
System.out.println(“Current inventory: “ + machine.getCount() + “ gumballs”);
System.out.println(“Current state: “ + machine.getState());
}
}
Testando o Monitor
A implementação foi rápida. O presidente da companhia ficará espantado e admirado com a nossa capacidade de desenvolvimento.
Agora só falta criar uma instância de GumballMonitor e lhe fornecer uma máquina para monitorar:
public class GumballMachineTestDrive {
public static void main(String[] args) {
int count = 0;
if (args.length < 2) {
System.out.println(“GumballMachine <name> <inventory>”);
System.exit(1);
}
count = Integer.parseInt(args[1]);
GumballMachine gumballMachine = new GumballMachine(args[0], count);
GumballMonitor monitor = new GumballMonitor(gumballMachine);
// restante do código de teste aqui
monitor.report();
}
}
Nosso método report() simplesmente
imprime um relatório com a localização, o
estoque e o estado da máquina.
Passa uma localização e um número
inicial de gomas na linha de comando.
…além de criar uma instância do monitor
e especificar qual máquina ela deverá
monitorar.
%java GumballMachineTestDrive Seattle 112
Gumball Machine: Seattle
Current Inventory: 112 gumballs
Current State: waiting for quarter
File Edit Window Help FlyingFish
E aqui está a saída!
Não se esqueça de fornecer uma
localização e uma contagem ao
construtor…
A saída produzida pelo monitor está
ótima, mas acho que não me expliquei
bem. Quero monitorar as máquinas de
goma REMOTAMENTE! De fato, nossa
rede de monitoramento já foi instalada.
Vamos lá, pessoal, vocês são ou não são
a geração internet?
Quando precisamos de um
relatório sobre a máquina, nós
chamamos o método report().
CG_ucpadroes_RI2016.indb 327 22/11/2016 09:36:55
Get Use A Cabeça Padrões E Projetos now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.