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 클래스를 생성하고 처리하게 됩니다.
워드를 실행할때 필요한 그림객체나 도형객체를 모두 불러오게 되면 그만큼 로딩속도가 느려지게 됩니다. 하지만 필요할때마다 그림객체를 불러오게된다면 그만큼 로딩속도를 줄일 수 있겠죠.
'프로그래밍 > 자바 디자인패턴' 카테고리의 다른 글
디자인패턴 Interpreter 패턴 (0) | 2012.08.27 |
---|---|
디자인패턴 Command 패턴 (1) | 2012.08.18 |
디자인패턴 Flyweight 패턴 (0) | 2012.08.15 |
디자인패턴 State 패턴 (0) | 2012.08.14 |
디자인 패턴 Memento 패턴 (0) | 2012.08.13 |
디자인패턴 Observer 패턴 (0) | 2012.08.10 |
디자인패턴 Mediator 패턴 (0) | 2012.08.09 |
디자인패턴 Facade 패턴 (0) | 2012.08.06 |