선생님의 블로그에서 가져온 설명.
public interface TargetInterface {
void run();
}
Proxy와 실체 구현체인 Target 모두의 추상이 되는 인터페이스.
간단한 추상매서드인 run()을 선언
public class TargetImpl implements TargetInterface {
@Override
public void run() {
System.out.println("I'm running");
}
}
추상 매서드의 구현체인 TargetImpl. 실제의 경우, 프록시패턴으로 감싸려고 하는 실 객체가 될것이다.
public class Proxy implements TargetInterface{
private final TargetInterface target;
public Proxy(TargetInterface target) {
this.target = target;
}
@Override
public void run() {
System.out.println("Intercept start!");
target.run();
System.out.println("Intercept end!");
}
}
패턴을 감싸는 프록시.
public class Client {
private TargetInterface targetInterface;
public Client(TargetInterface targetInterface) {
this.targetInterface = targetInterface;
}
public void execute(){
targetInterface.run();
}
}
타겟인터페이스를 호출하는 execute() 매서드를 정의한 구현체를 하나 더 만든다.
public class DecoratorPattern {
static void noDecoratorPattern(){
TargetInterface targetInterface = new TargetImpl();
Client client = new Client(targetInterface);
client.execute();
}
static void decoratorPattern(){
TargetInterface target = new TargetImpl();
TargetInterface proxy = new Proxy(target);
Client client = new Client(proxy);
client.execute();
}
public static void main(String[] args) {
noDecoratorPattern();
System.out.println("=========================");
decoratorPattern();
}
}
각각의 역할을 하는 인스턴스들을 생성 한 후, 정의한 매서드를 실행해 본다.
결과는 다음과 같다.
의도한대로, 그리고 Spring에서 써보았던 AOP 프록시의 느낌으로(@Around) 사용 가능하다.