>  기사  >  Java  >  Java 디자인 패턴 프로그래밍에서 프록시 패턴을 사용하는 방법을 설명하는 예

Java 디자인 패턴 프로그래밍에서 프록시 패턴을 사용하는 방법을 설명하는 예

高洛峰
高洛峰원래의
2017-02-07 13:33:131231검색

정의:

다른 개체에 대한 대리자 또는 자리 표시자를 제공하여 해당 개체에 대한 액세스를 제어합니다.

다른 개체에 대한 프록시를 제공하여 이 개체에 대한 액세스를 제어합니다.

일반 설명:

일반적으로 추상 테마, 구체적 테마, 에이전트 테마의 세 가지 역할이 포함됩니다.

추상 테마: 추상 클래스 또는 인터페이스이며 일반적인 비즈니스 유형 정의입니다.

특정 테마: 비즈니스 로직의 특정 실행자

에이전트 역할: 실제 역할의 적용을 담당하고 추상 테마 클래스에서 정의한 모든 메서드 제한 사항을 실제 테마 역할에 위임하여 구현합니다.

일반 클래스 다이어그램:

Java 디자인 패턴 프로그래밍에서 프록시 패턴을 사용하는 방법을 설명하는 예

일반 코드:

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 중국어 웹사이트에서 관련 기사를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.