프록시 모드


프록시 패턴에서 한 클래스는 다른 클래스의 기능을 나타냅니다. 이러한 유형의 디자인 패턴은 구조적 패턴입니다.

프록시 패턴에서는 외부 세계에 기능적 인터페이스를 제공하기 위해 기존 객체로 객체를 생성합니다.

Introduction

의도: 이 개체에 대한 액세스를 제어하려면 다른 개체에 대한 프록시를 제공하세요.

주요 해결 방법: 객체에 직접 액세스할 때 발생하는 문제(예: 액세스할 객체가 원격 시스템에 있음). 객체 지향 시스템에서 일부 객체에 직접 접근하면 특정 이유로 인해 사용자나 시스템 구조에 많은 문제가 발생합니다(예: 객체 생성 비용이 많이 들거나 특정 작업에 보안 제어가 필요하거나 프로세스 외부가 필요함). access) 이 개체에 액세스할 때 이 개체에 액세스 레이어를 추가할 수 있습니다.

사용 시기: 수업에 액세스할 때 어느 정도 제어권을 갖고 싶습니다.

해결 방법: 중간 레이어를 추가하세요.

키 코드: 구현 및 프록시 클래스 조합.

응용 사례: 1. 2. Zhu Bajie가 Gao Cuilan을 찾으러 갔을 때 그는 Sun Wukong으로 밝혀졌습니다. Gao Cuilan의 모습이 추상화되었으며 Zhu Bajie가 Gao Cuilan을 방문했을 때 Sun Wukong이 이 인터페이스를 구현했습니다. 그는 이것이 Sun Wukong인지 알 수 없었기 때문에 Sun Wukong은 Gao Cuilan 요원 클래스라고 합니다. 3. 기차표를 기차역에서 살 필요 없이 대리점에 가셔도 됩니다. 4. 수표 또는 은행 예금 증명서는 계좌 자금의 대리인입니다. 수표는 시장 거래에서 현금 대신 사용되며 발행자의 계좌에 보관된 자금을 통제할 수 있습니다. 5. 스프링 AOP.

장점: 1. 명확한 책임. 2. 높은 확장성. 3. 지능적.

단점: 1. 클라이언트와 실제 주제 사이에 프록시 개체가 추가되어 일부 유형의 프록시 모드에서는 요청 처리 속도가 느려질 수 있습니다. 2. 프록시 모드를 구현하려면 추가 작업이 필요하며 일부 프록시 모드의 구현은 매우 복잡합니다.

사용 시나리오: 책임별로 구분하면 일반적으로 다음과 같은 사용 시나리오가 있습니다. 1. 원격 에이전트. 2. 가상 에이전트. 3. 기록 중 복사 에이전트. 4. 에이전트를 보호(보호 또는 액세스)합니다. 5. 캐시 에이전트. 6. 방화벽 프록시. 7. 동기화 에이전트. 8. 스마트 참조 에이전트.

참고: 1. 어댑터 패턴과 어댑터 패턴의 차이점: 어댑터 패턴은 주로 고려 중인 개체의 인터페이스를 변경하는 반면 프록시 패턴은 프록시 클래스의 인터페이스를 변경할 수 없습니다. 2. 데코레이터 모드와 데코레이터 모드의 차이점: 데코레이터 모드는 기능을 향상시키는 것이고 프록시 모드는 기능을 제어하는 ​​것입니다.

Implementation

Image 인터페이스와 Image 인터페이스를 구현하는 엔터티 클래스를 생성하겠습니다. ProxyImageRealImage 개체 로딩의 메모리 사용량을 줄이는 프록시 클래스입니다.

ProxyPatternDemo, 데모 클래스는 ProxyImage를 사용하여 Image 개체를 로드하고 필요에 따라 표시합니다.

proxy_pattern_uml_diagram.jpg

1단계

인터페이스를 만듭니다.

Image.java

public interface Image {
   void display();
}

2단계

인터페이스를 구현하는 엔터티 클래스를 만듭니다.

RealImage.java

public class RealImage implements Image {

   private String fileName;

   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }

   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }

   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}

ProxyImage.java

public class ProxyImage implements Image{

   private RealImage realImage;
   private String fileName;

   public ProxyImage(String fileName){
      this.fileName = fileName;
   }

   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

3단계

요청 시 ProxyImage를 사용하여 RealImage 클래스의 개체를 가져옵니다.

ProxyPatternDemo.java

public class ProxyPatternDemo {
	
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");

      //图像将从磁盘加载
      image.display(); 
      System.out.println("");
      //图像将无法从磁盘加载
      image.display(); 	
   }
}

4단계

출력을 확인합니다.

rreee