= Proxy Pattern = 본인이 필요해질 때까지 대리인(Proxy)에게 위임. 본인에 대한 접근(Access)를 줄여주는 패턴. * **접근 제어** * Authorization * Caching * Lazy loading * [[design_pattern:decorator_pattern|부가 기능 추가]] {{tag>Architecture Modeling Design_Pattern Structural}} = Virtual Proxy = Instance가 필요한 시점에서 생성 및 초기화를 실행. 필요한 객체만 생성하여 초기화시 속도 향상. 이 때, RealSubject 역할은 Proxy의 존재를 알지 못함. (말 그대로 대리자.) Lazy Loading. == API == === Subject === public interface Printable { void setPrinterName(String name); String getPrinterName(); void print(String string); } === Proxy === package core; public class PrinterProxy implements Printable { private String name; private Printer real; public PrinterProxy() { } public PrinterProxy(String name) { this.name = name; } @Override public synchronized void setPrinterName(String name) { if(real != null) real.setPrinterName(name); this.name = name; } @Override public String getPrinterName() { return name; } @Override public void print(String string) { realize(); real.print(string); } private synchronized void realize() { if(real == null) real = new Printer(name); } } === RealSubject === public class Printer implements Printable { private String name; public Printer(String name) { this.name = name; heavyJob("Printer의 instance " + name + " 생성 중"); } @Override public void setPrinterName(String name) { this.name = name; } @Override public String getPrinterName() { return name; } @Override public void print(String string) { System.out.println(name + " / " + string); } private void heavyJob(String message) { System.out.println(message); for(int i=0 ; i<5 ; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.print("."); } System.out.println("완료!"); } } == Client == public class Client { public static void main(String[] args) { Printable p = new PrinterProxy("Luke"); System.out.println("Who are you? " + p.getPrinterName()); p.setPrinterName("Michael"); System.out.println("Who are you? " + p.getPrinterName()); // 대리자가 처리할 수 없는 무거운 작업. 이 때, RealSubject가 필요해지는 시점. (Lazy loading) p.print("Hello, world!"); } } /* Who are you? Luke Who are you? Michael Printer의 instance Michael 생성 중 .....완료! Michael / Hello, world! */ = Remote Proxy = RealSubject 역할이 네트워크의 상대 쪽에 있음에도 불구하고 마치 자신의 옆에 있는 것처럼(투과적으로) Method 호출 가능. Java의 RMI (Remote Method Invocation)등이 여기에 해당. = Access Proxy = Real Subject 역할의 기능에 대해서 접근 제한을 설정. 정해진 사용자면 Method 호출 허가, 그외 Error 처리.