자바

[자바] Proxy 패턴

devjones 2021. 6. 12. 22:55
package proxy;

public interface Printable {
	public void setPrinterName(String name);
	public String getPrintName();
	public void print(String str);
}
package proxy;

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) {
		this.name = name;
	}

	@Override
	public String getPrintName() {
		return name;
	}

	@Override
	public void print(String str) {
		System.out.println("=== " + name + " ===");
		System.out.println(str);
	}

	private void heavyJob(String msg) {
		System.out.print(msg);
		
		for (int i = 0; i < 5; i++) {
			try {
				Thread.sleep(1000);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			System.out.print(".");
		}
		
		System.out.println("완료.");
	}
}
package proxy;

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 getPrintName() {
		return name;
	}

	@Override
	public void print(String str) {
		realize();
		real.print(str);
	}
	
	private synchronized void realize() {
		if(real == null) {
			real = new Printer(name);
		}
	}

}
package proxy;

public class Main {
	public static void main(String[] args) {
		Printable p = new PrinterProxy("Alice");
		System.out.println("이름은 현재 " + p.getPrintName() + "입니다.");
		p.setPrinterName("Bob");
		System.out.println("이름은 현재 " + p.getPrintName() + "입니다.");
		p.print("Hello, world");
		
	}
}

 

결과:

 

이름은 현재 Alice입니다.
이름은 현재 Bob입니다.
Printer의 인스턴스(Bob) 생성 중.....완료.
=== Bob ===
Hello, world