[Java] Design Pattern - Proxy


その名の通り、スポークスマンの意味です.他の人に代わってその職責を果たす存在.
番組では、Proxyに何かを代わってもらう.
ただし、トラフィックのみを制御でき、結果値の操作や変更はできません.실제 기능을 수행하는 객체 대신 가상의 객체를 사용해 로직의 흐름을 제어のデザインモードです.
特長
  • Proxyは、実際のサービスと同じ名前の方法を実装します.
  • Proxyは、実際のサービスの参照変数を有する.
  • Proxyは、実際のサービスと同じ名前のメソッドを呼び出し、その値をクライアントに返します.
  • Proxyは、実際のサービスメソッド呼び出しの前後で個別の論理を実行することができる.
  • // Thumbnail.java
    package DesignPattern.proxy;
    
    interface Thumbnail {
        void showTitle();
    
        void showPreview();
    }
    
    class RealThumbnail implements Thumbnail {
        private String title;
        private String movieUrl;
    
        public RealThumbnail(String _title, String _movieUrl) {
            this.title = _title;
            this.movieUrl = _movieUrl;
    
            System.out.println(movieUrl + "로 부터" + title + "의 영상 데이터 다운");
        }
    
        @Override
        public void showTitle() {
            System.out.println("Real 제목 : " + title);
        }
    
        @Override
        public void showPreview() {
            System.out.println(title + "의 프리뷰 재생");
        }
    }
    
    class ProxyThumbnail implements Thumbnail {
        private String title;
        private String movieUrl;
        private RealThumbnail realThumbnail;
    
        public ProxyThumbnail(String _title, String _movieUrl) {
            this.title = _title;
            this.movieUrl = _movieUrl;
        }
    
        @Override
        public void showTitle() {
            System.out.println("Proxy 제목 : " + title);
        }
    
        @Override
        public void showPreview() {
            if (realThumbnail == null) {
                realThumbnail = new RealThumbnail(title, movieUrl);
            }
            realThumbnail.showPreview();
        }
    }
    package DesignPattern.proxy;
    
    import java.util.ArrayList;
    
    public class MyProgram {
        public static void main(String[] args) {
            ArrayList<Thumbnail> thumbnails = new ArrayList<>();
    
            thumbnails.add(new ProxyThumbnail("A 영상", "/a.mp4"));
            thumbnails.add(new ProxyThumbnail("B 영상", "/b.mp4"));
            thumbnails.add(new ProxyThumbnail("C 영상", "/c.mp4"));
            thumbnails.add(new ProxyThumbnail("D 영상", "/d.mp4"));
            thumbnails.add(new ProxyThumbnail("E 영상", "/e.mp4"));
    
            for (Thumbnail thumbnail : thumbnails) {
                thumbnail.showTitle();
            }
    
            thumbnails.get(2).showPreview();
            thumbnails.get(2).showPreview();
            thumbnails.get(4).showPreview();
            thumbnails.get(1).showPreview();
        }
    }
    Proxyは実行メソッドを直接呼び出すのではなく、ストリーム制御を採用したい.
    私たちがよく見るYouTubeの動画を例にとると、動画に入る前にサムネイルとマウスをサムネイルの上に置くと、プレビューの形で動画を短く見せることができます.
    プレビューではなく、ビデオ全体を表示する場合は、大きなデータをロードする画像やグラフィックに時間がかかるため、バッファリングが必要になる場合があります.
    したがって,エージェントが制御フローによってロードの少ないプレビューを優先的に表示しても問題はない.