[6단원]디자인 패턴 - 프록시 패턴 추가예제

  • 회사의 웹 사이트가 사용자에게 많은 이미지를 보여줌.
  • 그로 인하여 페이지의 로딩 시간이 길어져서 UX 가 저하됨.
  • 프록시 패턴으로 이미지 로딩을 최적화 가능

구현

  • 공통 인터페이스
    public interface Image {
        void display();
    }
  • 실제 이미지 클래스
    public class RealImage implements Image {
        private String fileName;
        
        public RealImage(String fileName) {
            this.fileName = fileName;
            this.loadFromDisk();
        }
        
        private void loadFromDisk() {
            System.out.println("Loalding " + fileName);
        }
        
        @Override
        public void display() {
            System.out.println("Displaying " + fileName);
        }
    }
  • 프록시 이미지 클래스
    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();
        }
    }
  • 클라이언트
    public class ClientWithProxy {
        public static void main(String[] args) {
            Image proxyImage = new ProxyImage("image1.png");
            // 이미지 로딩 X 파일 이름만 출력
            proxyImage.display();
            // 이미지 로딩후 show
            proxyImage.display();
        }
    }
  • RealImage 클래스
    • 디스크에서 이미지를 로딩하여 보여주는 역할
  • ProxyImage
    • RealImage 의 프록시로서, 처음에는 이미지를 로딩하지 않음.
    • 사용자가 이미지 요청 시 실제 이미지를 로딩하여 보여준다.

리소스의 절약

  • 같은 이미지를 반복적으로 로딩하는 것은 불필요한 리소스의 소모를 유발함.
  • 이미지를 한 번만 로딩하면 해당 리소스의 절약이 가능

레이지 로딩

  • 이미지가 필요할 때만 로딩
  • 초기 앱의 로딩 시간 줄일 수 있음.

유연성

  • 실제 객체의 구현을 변경 X
  • 프록시 클래스 + 공통 인터페이스만 추가한다면, 해당 패턴을 적용가능하다.

?

  • 싱글톤 패턴과 유사한데, 이런식으로 별도 코드 변경없이, 중간에 별도 로직을 추가하기 위해서 사용하는 것. 이 전부인지

Uploaded by N2T