definição:
Forneça um substituto ou espaço reservado para outro objeto para controlar o acesso a ele.
Um proxy para outros objetos controlarem o acesso a esse objeto.
Descrição geral:
Geralmente, contém três papéis: tema abstrato, tema concreto e tema do agente.
Diagrama de classe geral:
Código Geral:
Proxy do pacote; // Classe de tópico abstrato: Assunto da interface pública {public void Dosomething ();} Proxy do pacote; // classe de tópico específico classe public }} proxy do pacote; // classe de proxy de proxy proxy implementa o assunto {sujeito privado sub = null; @Override public void Dosomething () {this.sub.dosomething (); } public proxy (sujeito sub) {this.sub = sub; }} proxy do pacote; // client da classe public client {public static void main (string [] args) {sujeito realsub = new realsubject (); Proxy de sujeito = novo proxy (RealSub); proxy.dosomething (); }}vantagem :
1. Responsabilidades claras
2. Alta expansão
Extensões do modo proxy:
Agente normal:
As classes temáticas específicas são transparentes a níveis de alto nível, e classes temáticas específicas são construídas em classes temáticas de proxy.
Implementação de código:
pacote generalproxy; Public Interface Assunto {public void Dosomething ();} pacote generalProxy; public class RealSubject implementa sujeito {private string name = null; @Override public void Dosomething () {System.out.println (this.name + "Proxy, executando a lógica de negócios ..."); } public realSubject (proxy do sujeito, nome da string) lança a exceção {if (proxy == null) {lança nova exceção ("objeto proxy não pode ser criado"); } else {this.name = name; }}} pacote generalproxy; classe pública implementa o sujeito {private sujeito realsub = null; public proxy (nome da string) {try {realsub = new RealSubject (this, nome); } catch (Exceção e) {e.printStackTrace (); }} public void Dosomething () {realsub.dosomething (); }} pacote generalProxy; public class Client {public static void main (String [] args) {// Proxy Ordinary Proxy Proxy = new Proxy ("Zhang San"); proxy.dosomethaing (); }}
Proxy forçado:
Você deve obter o objeto da classe de tópicos proxy acessando a classe de tópico específica e, em seguida, use a classe de tópicos proxy para controlar o acesso.
Implementação de código:
pacote deveproxy; Public Interface Assunto {public void Dosomething (); assunto público getProxy ();} pacote deveproxy; public class RealSubject implementa sujeito {private string name = null; Proxy de assunto privado = nulo; @Override public void Dosomething () {if (isProxy ()) {System.out.println (this.name + "Proxy, executando a lógica de negócios ..."); } else {System.out.println ("Acesse o proxy primeiro ..."); }} public realSubject (nome da string) {this.name = name; } public sujeito getProxy () {proxy = new proxy (this); retornar este.proxy; } private boolean isProxy () {if (this.proxy == null) {return false; } else {return true; }}} pacote mustproxy; classe pública implementa o sujeito {private sujeito realsub = null; Proxy público (sujeito realsub) {this.realsub = realsub; } public void Dosomething () {this.realsub.dosomething (); } public sujeito getProxy () {return th This; }} pacote mustproxy; public class cliente {public static void main (string [] args) {sujeito realsub = new realsubject ("zhang san"); realsub.dosomething (); Assunto proxy = realsub.getproxy (); proxy.dosomething (); }} Cenários de aplicação
No mundo real, o secretário é equivalente a um agente. Se o chefe realizar uma reunião, notifique os funcionários da hora da reunião, organize o local, resolva o local após a reunião e assim por diante, etc., você pode entregar o trabalho relacionado à reunião à secretária. O chefe só precisa realizar a reunião e não precisa fazer essas coisas pessoalmente. Da mesma forma, em nossa programação, também podemos usar o padrão de proxy para dissociar o código combinado com uma série de lógica não relacionada, como o código de log no código de negócios, pode ser executado no proxy. AOP da Spring é um aplicativo dinâmico de proxy típico.
Formulário de aplicação do modo proxy
(1) Proxy remoto - pode ocultar o fato de que existe um objeto em diferentes espaços de endereço. Ele também permite que os clientes acessem objetos em máquinas remotas. Máquinas remotas podem ter melhor desempenho de computação e velocidade de processamento e podem responder rapidamente e processar solicitações de clientes.
(2) O proxy virtual permite que objetos com alta sobrecarga de memória sejam criados quando necessário. Crie apenas quando realmente precisamos desse objeto.
(3) O proxy de cópia sobre gravação é usado para controlar a cópia de objetos, atrasando a cópia de objetos até que o cliente realmente precise deles. É uma variante do proxy virtual.
(4) Protection (Access) Proxy) fornece diferentes níveis de direitos de acesso a objetos de destino para diferentes clientes
(5) O proxy do cache fornece armazenamento temporário para resultados computacionais gerais. Ele permite que vários clientes compartilhem resultados para reduzir a computação ou a latência da rede.
(6) O Firewall Proxy controla o acesso aos recursos de rede e protege o assunto de clientes maliciosos.
(7) A sincronizaçãoproxy fornece acesso seguro ao tópico no caso de multi-threading.
(8) Proxy de referência inteligente - Quando um objeto é referenciado, ele fornece algumas operações adicionais, como registrar o número de chamadas para esse objeto, etc.
(9) A complexidade oculta proxy é usada para ocultar a complexidade de uma coleção complexa de uma classe e executar o controle de acesso. Às vezes, também é chamado proxy de fachada, o que não é difícil de entender. O modo complexo de proxy oculto e aparência é diferente porque o proxy controla o acesso, enquanto o modo de aparência é diferente porque o proxy controla o acesso, enquanto o modo de aparência fornece apenas outro conjunto de interfaces.