프로그래밍/자바 디자인패턴

디자인패턴 Proxy 패턴

가카리 2012. 8. 16. 16:00
반응형

Proxy 패턴

 

 

이름

해설

Printer

이름있는 프린터를 나타내는 클래스(본인)

Printable

Printer PrinterProxy 공통의 인스턴스

PrinterProxy

이름있는 프린터를 나타내는 클래스(대리인)

Main

동작 테스트용 클래스

 

 

 

 

 

 

 

 

Printable 인터페이스

 

package kch;

public interface Printable {

          

           public abstract void setPrinterName(String name);//이름의 설정

           public abstract String getPrinterName();//이름의 취득

           public abstract void print(String string);//문자열 표시

          

}

 

 

Printer 클래스

 

package kch;

 

public class Printer implements Printable{

 

           private String name;

           public Printer(){//사용안했음

                     heavyJob("Printer의 인스턴스를 생성 중");

           }

           public Printer(String name){                                                //생성자

                     this.name = name;

                     heavyJob("Printer의 인스턴스 (" + name + ")을 생성중");

           }

          

           @Override

           public void setPrinterName(String name) {//이름의 설정(사용안했음)

                     // TODO Auto-generated method stub

                     this.name = name;

           }

 

           @Override

           public String getPrinterName() {                                          //이름의 취득(사용안했음)

                     // TODO Auto-generated method stub

                     return name;

           }

 

           @Override

           public void print(String string) {                                          //이름을 붙여서 표시

                     // TODO Auto-generated method stub

                     System.out.println("=== " + name + " ===");

                     System.out.println(string);

           }

 

           private void heavyJob(String msg){               //무거운 일

                     System.out.println(msg);

                    

                     for(int i = 0 ; i < 5; i++){

                    

                                try{

                               

                                          Thread.sleep(1000);

                               

                                }catch(InterruptedException e){

                               

                                }

                                System.out.print(".");

                     }

                      System.out.println("완료. ");

           }

}

 

 

PrinterProxy 클래스

 

package kch;

 

public class PrinterProxy implements Printable{

 

           private String name;

           private Printer real;

          

           public PrinterProxy(String name){                                        //생성자

                    

                     this.name = name;

                    

           }

          

           @Override

           public synchronized void setPrinterName(String name) {//이름의 설정, 가벼운 일

                     // TODO Auto-generated method stub

                    

                     if(real != null){

                                real.setPrinterName(name);//'본인'에게도 설정한다.

                     }

                     this.name = name;

           }

 

           @Override

           public String getPrinterName() {                     //이름을 가져옴, 가벼운 일

                     // TODO Auto-generated method stub

                     return name;

           }

 

           @Override

           public void print(String string) {                     //표시, 무거운 일

                     // TODO Auto-generated method stub

                    

                     realize();

                     real.print(string);//Hello world.string 들어있음.

                    

           }

 

           private synchronized void realize(){             //'본인'을 생성

                     if(real == null){

                                real = new Printer(name);//생성자에 무거운일이 포함되있음(5초나 걸리는일)

                     }

           }

}

 

 

Main 클래스

 

package kch;

 

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.");

           }

 

}

 

 

 

결과화면

 

 

Proxy 패턴은 빠르고 쉽게 처리하는것은 대리인(Proxy)이 처리하고 오래 걸릴것 같은 일은 실제 본인이 처리하게 합니다.

 

여기서 대리인은 PrinterProxy이고 본인은 Printer 클래스입니다.

 

이름을 설정하고 가져오는 가벼운일은 PrinterProxy가 하지만 정작 Print라는 무거운일을 할때는 Print 클래스를 생성하고 처리하게 됩니다.

 

워드를 실행할때 필요한 그림객체나 도형객체를 모두 불러오게 되면 그만큼 로딩속도가 느려지게 됩니다. 하지만 필요할때마다 그림객체를 불러오게된다면 그만큼 로딩속도를 줄일 수 있겠죠.

 

 

반응형