정의:
다른 개체에 대한 대리자 또는 자리 표시자를 제공하여 해당 개체에 대한 액세스를 제어합니다.
다른 개체에 대한 프록시를 제공하여 이 개체에 대한 액세스를 제어합니다.
일반 설명:
일반적으로 추상 테마, 구체적 테마, 에이전트 테마의 세 가지 역할이 포함됩니다.
추상 테마: 추상 클래스 또는 인터페이스이며 일반적인 비즈니스 유형 정의입니다.
특정 테마: 비즈니스 로직의 특정 실행자
에이전트 역할: 실제 역할의 적용을 담당하고 추상 테마 클래스에서 정의한 모든 메서드 제한 사항을 실제 테마 역할에 위임하여 구현합니다.
일반 클래스 다이어그램:
일반 코드:
package Proxy; //抽象主题类: public interface Subject { public void doSomething(); } package Proxy; //具体主题类 public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("业务逻辑..."); } } package Proxy; //代理主题类 public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } } package Proxy; //客户端 public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); } }
장점:
1. 명확한 책임
2. 높은 확장성
프록시 모드 확장:
일반 프록시:
특정 주제 클래스는 상위 수준에 투명하며, 특정 주제 클래스는 프록시 토픽 클래스
코드 구현:
package GeneralProxy; public interface Subject { public void doSomething(); } package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在执行业务逻辑..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("无法创建被代理对象"); }else{ this.name = name; } } } package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); } } package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("张三"); proxy.doSomethaing(); } }
강제 프록시:
특정 테마 클래스에 접근하여 프록시 테마 클래스의 객체를 얻어야 하며, 그런 다음 프록시 테마 클래스를 사용하여 액세스를 제어합니다.
코드 구현:
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy(); } package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在执行业务逻辑..."); }else{ System.out.println("请先访问代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } } } package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; } } package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("张三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); } }
응용 시나리오
실제로는 상사가 회의를 할 때 비서가 대리인과 같습니다. 그러면 직원들에게 회의 시간 알리기, 회의 장소 정리, 회의 후 회의 장소 정리 등 회의 관련 업무를 인계할 수 있습니다. 비서에게 하면 상사는 회의를 하고 회의만 하면 됩니다. 그런 일을 스스로 할 필요는 없습니다. 같은 방식으로 프록시 패턴을 프로그래밍에서 사용하여 관련 없는 논리와 결합된 일련의 코드를 분리할 수도 있습니다. 예를 들어 비즈니스 코드의 로깅 코드는 프록시에서 수행될 수 있습니다. Spring의 AOP는 일반적인 동적 프록시 애플리케이션입니다.
프록시 모드의 적용 형태
(1) 원격 프록시 - 객체가 다른 주소 공간에 존재한다는 사실을 숨길 수 있습니다. 또한 이를 통해 클라이언트는 원격 시스템의 개체에 액세스할 수 있으며, 원격 시스템은 더 나은 컴퓨팅 성능과 처리 속도를 가지며 클라이언트 요청에 신속하게 응답하고 처리할 수 있습니다.
(2)가상 프록시 – 필요할 때 메모리 오버헤드가 큰 개체를 생성할 수 있습니다. 이 객체는 정말로 필요할 때만 생성하세요.
(3) 쓰기 중 복사 프록시 - 클라이언트가 실제로 필요할 때까지 개체 복사를 지연하여 개체 복사를 제어하는 데 사용됩니다. 가상 에이전트의 변형입니다.
(4) 보호 프록시(Protection(Access) Proxy) – 고객별로 서로 다른 수준의 대상 개체 액세스 권한을 제공합니다.
(5) 캐시 프록시(Cache Proxy) – 값비싼 계산 결과를 위한 임시 저장소를 제공합니다. 여러 클라이언트가 결과를 공유하여 계산 또는 네트워크 대기 시간을 줄입니다.
(6) 방화벽 프록시 – 네트워크 리소스에 대한 액세스를 제어하고 악성 클라이언트로부터 테마를 보호합니다.
(7)SynchronizationProxy – 다중 스레드 상황에서 주제에 대한 안전한 액세스를 제공합니다.
(8) 스마트 참조 프록시 - 개체가 참조되면 이 개체에 대한 호출 수를 기록하는 등 몇 가지 추가 작업을 제공합니다.
(9) Complexity HidingProxy – 클래스의 복잡한 컬렉션의 복잡성을 숨기고 액세스 제어를 수행하는 데 사용됩니다. 때로는 Façade Proxy라고도 하는데, 이해하기 어렵지 않습니다. 복잡한 숨겨진 프록시는 프록시가 액세스를 제어한다는 점에서 파사드 패턴과 다르며, 파사드 패턴은 프록시가 액세스를 제어한다는 점에서 다르며, 파사드 패턴은 또 다른 인터페이스 세트를 제공할 뿐입니다.
Java 디자인 패턴 프로그래밍에서 프록시 패턴을 사용하는 방법을 설명하는 더 많은 예제를 보려면 PHP 중국어 웹사이트에서 관련 기사를 주목하세요!