[디자인 패턴] Proxy Pattern

.·2021년 8월 11일
0

Structural Pattern - Proxy Pattern

📚 의도

사용할 객체의 제어권을 위임함으로써, 객체에 대한 클라이언트의 요청을 대신 받아 전달합니다.

Porxy = 대리, 대신

원래 개체에 대한 액세스를 제어하므로 요청이 원래 객체에 전달되기 전이나 후에 수행할 수 있다.

  • 예제
    이미지를 로딩할 때 프록시 서버에 저장하고 다음 요청 때 실제 서비스가 아닌 프록시에서 이미지 로드(캐싱)

🧱 구조

Structure of the Proxy design pattern

  1. ServiceInterface
  2. Service
    • 유용한 비즈니스 로직 제공
  3. Proxy
    • 실제 서비스 객체와 같은 인터페이스를 구현
    • Service 객체의 레퍼런스 필드를 가진다.
  4. Client
    • Service에게 기대하는 일을 Proxy에게 전달한다.

💻 코드

  1. ServiceInterface

    public interface Image {
        void displayImage();
    }
  2. Service

    public class RealImage implements Image {
        private String filename;
    
        public RealImage(String filename) {
            this.filename = filename;
            loadImageFromDisk();
        }
    
        private void loadImageFromDisk() {
            System.out.println("Load " + filename);
        }
    
        @Override
        public void displayImage() {
            System.out.println("Display " + filename);
        }
    }
  3. Proxy

    public class ProxyImage implements Image {
        private String filename;
        private Image image;
    
        public ProxyImage(String filename) {
            this.filename = filename;
        }
    
        @Override
        public void displayImage() {
            if (image == null) {
                image = new RealImage(filename);
            }
            image.displayImage();
        }
    }
  4. Client

    public class Client {
        public static void main(String[] args) {
            Image image1 = new ProxyImage("abc.png");
            Image image2 = new ProxyImage("xyz.png");
    
            image1.displayImage();
            image1.displayImage();
    
            image2.displayImage();
            image2.displayImage();
        }
    }
  • Console

    Load abc.png
    Display abc.png
    
    Display abc.png
    
    Load xyz.png
    Display xyz.png
    
    Display xyz.png

🔮 장단점

  • 장점
    1. 클라이언트가 알지 못하는 상태에서 서비스 개체를 제어할 수 있다.
      • 주요 로직의 전후에 추가로 처리로 해주어야할 때 원본을 수정하지 않고 프록시에서 수정 가능
      • 같은 인터페이스를 구현하기 때문
    2. 사이즈가 큰 객체가 로딩되기 전에도 프록시를 통해 참조할 수 있다.
    3. 클라이언트가 신경 쓰지 않을 때 서비스 개체의 수명 주기를 관리할 수 있다.
  • 단점
    1. 서비스로부터의 응답이 지연될 수 있다.
      • 객체를 생성할 때 한 단계를 거치기 때문
    2. 새로운 클래스들을 만들어야해서 복잡한 코드가 될 수 있다.

➰ 어떤 상황에서 사용될까?

  • 가상 프록시
    • 꼭 필요로 하는 시점까지 객체 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을때 사용하는 패턴
  • 원격 프록시
    • 원격 객체에 대한 접근을 제어 로컬 환경에 존재하며, 원격객체에 대한 대변자 역할을 하는 객체 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하게 만드는 패턴
  • 보호 프록시
    • 주체 클래스에 대한 접근을 제어하기 위한 경우에 객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을때 사용하는 패턴

출처

0개의 댓글