디자인 패턴 ~Proxy~

1. 소개



GoF의 디자인 패턴에서 프록시 패턴을 요약합니다.

2. Proxy 패턴이란?


  • Proxy라는 영어 단어는 대리인이라는 의미입니다.
  • 오브젝트 지향에서는 「본인」도 「대리인」도 오브젝트가 됩니다.
  • Proxy 패턴은 바쁘고 일할 수 없는 본인 오브젝트 대신에 대리인 오브젝트가 일부의 일을 해내는 방식입니다.
  • GoF 디자인 패턴은 구조와 관련된 디자인 패턴으로 분류됩니다.

  • 3. 샘플 클래스 다이어그램





    4. 샘플 프로그램



    화면에 문자를 표시하는 「명명된 프린터」의 프로그램입니다.

    4-1. Printable 인터페이스



    Printer와 PrinterProxy 공통 인터페이스입니다.

    Printable.java
    public interface Printable {
        // 名前の設定
        public abstract void setPrinterName(String name);
        // 名前の取得
        public abstract String getPrinterName();
        // 文字列表示(プリントアウト)
        public abstract void print(String string);
    }
    

    4-2. PrinterProxy 클래스



    이름 첨부의 프린터를 나타내는 클래스입니다. (대리인)

    PrinterProxy.java
    public class PrinterProxy implements Printable {
    
        private String name;
        private Printer real;
    
        public PrinterProxy() {
        }
    
        public PrinterProxy(String name) {
            this.name = name;
        }
    
        public synchronized void setPrinterName(String name) {
            if (real != null) {
                real.setPrinterName(name);
            }
            this.name = name;
        }
    
        public String getPrinterName() {
            return name;
        }
    
        public void print(String string) {
            realize();
            real.print(string);
        }
    
        private synchronized void realize() {
            if (real == null) {
                real = new Printer(name);
            }
        }
    }
    

    4-3. Printer 클래스



    이름 첨부의 프린터를 나타내는 클래스입니다. (본인)

    Printer.java
    public class Printer implements Printable {
    
        private String name;
    
        public Printer() {
            heavyJob("Printerのインスタンスを生成中");
        }
    
        public Printer(String name) {
            this.name = name;
            heavyJob("Printerのインスタンス(" + name + ")を生成中");
        }
    
        public void setPrinterName(String name) {
            this.name = name;
        }
    
        public String getPrinterName() {
            return name;
        }
    
        public void print(String string) {
            System.out.println("=== " + name + " ===");
            System.out.println(string);
        }
    
        private void heavyJob(String msg) {
            System.out.print(msg);
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
                System.out.print(".");
            }
            System.out.println("完了。");
        }
    }
    

    4-4. Main 클래스



    메인 처리를 실시하는 클래스입니다.

    Main.java
    public class Main {
        public static void main(String[] args) {
            Printable p = new PrinterProxy("Alice");
            System.out.println("名前は現在" + p.getPrinterName() + "です。");
            p.setPrinterName("Bob");
            System.out.println("名前は現在" + p.getPrinterName() + "です。");
            p.print("Hello, world.");
        }
    }
    

    4-5. 실행 결과


    名前は現在Aliceです。
    名前は現在Bobです。
    Printerのインスタンス(Bob)を生成中.....完了。
    === Bob ===
    Hello, world.
    

    5. 장점



    프록시 패턴에서는 프록시가 대리인이 되어 가능한 한 처리를 어깨 대체합니다.
    샘플 프로그램에서는, Proxy역을 사용하는 것으로, 실제로 print 할 때까지, 무거운 처리(인스턴스 생성)를 지연시킬 수 있었습니다.
    예를 들어, 초기화에 시간이 걸리는 기능이 많이 존재하는 시스템의 경우, 기동 시점에서는 이용하지 않는 기능까지 전부 초기화해 버리면, 어플리케이션의 기동에 시간이 걸려 버리게 됩니다.
    PrinterProxy 클래스와 Printer 클래스의 2개로 나누지 않고, Printer 클래스 안에 처음부터 지연 기능을 넣어 둘 수도 있습니다만, 클래스를 나누는 것으로, 프로그램의 부품화가 진행되어 개별적으로 기능을 더하는 것 수 있습니다.

    6. GitHub


  • htps : // 기주 b. 코 m / 이타나카 730 /

  • 7. 디자인 패턴 목록


  • GoF 디자인 패턴 요약

  • 8. 참고



    이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
  • Java 언어로 배우는 디자인 패턴 입문

  • 매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
    디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.

    좋은 웹페이지 즐겨찾기