자바
[자바] 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