Proxy Pattern (대리자 패턴)

 -- 처리과정이 복잡하거나 시스템의 리소스를 많이 필요하거나 하는 객체가 필요할 때,

 -- 간단한 처리는 대리자가 하고 실제객체가 필요할 때 생성하여 처리하는 패턴.


 1. Remote Proxy : 원격 객체에 대한 로컬의 대리자

  : RMI(Remote Method Invoke)

: C# WCF(SOAP), Android(Proxy), COM(RPC)

 2. Virtual Proxy : 많은 비용이 요구되는 객체를 생성하는 경우 실제 객체가 사용되기 전 까지 

  해당하는 객체에 대한 로딩을 지연할 수 있다.

Flyweight Pattern과 함께 사용한다. (Cache)

 3. Protection Proxy : 보호가 요구되는 객체에 대한 접근을 통제하고, 대리자를 통해 접근 제어하는 방법

객체의 타입에 따른 접근 제어 (ex. 리플렉션)


  1. package com.tistory.metalbird;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. class Calc {
  7.         public void plus() {
  8.  
  9.         }
  10. }
  11.  
  12. class CalcProxy {
  13.         public void plus() {
  14.                 new Calc().plus(); // RMI 기술의 예. 중간객체를 둠으로써 문제를 해결
  15.         }
  16. }
  17.  
  18. // 인터페이스 기반의 설계
  19. interface Image {
  20.         void showImage();
  21. }
  22.  
  23. class ImageProxy implements Image {
  24.         private String url;
  25.        
  26.         public ImageProxy(String url) {
  27.                 this.url = url;
  28.         }
  29.         @Override
  30.         public void showImage() {
  31.                 // show image 가 호출 되었을때 로딩을 한다.
  32.                 // 부하가 많이 걸리는 작업을 대리자에게 넘긴다.
  33.                 System.out.println("lazy load");
  34.                 RealImage image = new RealImage(url);
  35.                 image.showImage();
  36.         }
  37.  
  38. }
  39.  
  40. // 라이브러리 형태로 존재
  41. class RealImage implements Image {
  42.         private String url;
  43.  
  44.         public RealImage(String url) {
  45.                 this.url = url;
  46.                 // downloading from url.
  47.                 // 부하가 많이 걸린다.
  48.         }
  49.  
  50.         public void showImage() {
  51.                 System.out.println("ShowImage : " + url);
  52.         }
  53.  
  54. }
  55.  
  56. public class Ex1 {
  57.  
  58.         public static void main(String[] args) {
  59.                 List<Image> images = new ArrayList<>();
  60.                 images.add(new ImageProxy("http://a.net/1.jpg"));
  61.                 images.add(new ImageProxy("http://a.net/2.jpg"));
  62.                 images.add(new ImageProxy("http://a.net/3.jpg"));
  63.                 images.add(new ImageProxy("http://a.net/4.jpg"));
  64.  
  65.                 for (Image i : images) {
  66.                         i.showImage();
  67.                 }
  68.         }
  69.  
  70. }


+ Recent posts