클라이언트가 특정 객체의 오퍼레이션에 접근하기 전 Proxy
를 지나서 접근하는 패턴
맨 처음 요청을 모두 Proxy
가 받게 된다. Proxy
객체를 생성해서 접근제어 및 만드는 데 리소스가 많이 필요한 객체에 대해서 효과를 볼 수 있다.
초기화 지연, 로깅이나 캐싱 또한 가능하다.
public class GameService {
public void startGame() {
System.out.println("text");
}
}
public class GameServiceProxy extends GameService {
@Override
public void startGame() {
long before = System.currentTimeMillis();
super.startGame();
System.out.println(System.currentTimeMillis() - before);
}
}
public class Client {
public static void main(String[] args) throws InterruptedException {
GameService gameService = new GameServiceProxy();
gameService.startGame();
}
}
public class DefaultGameService implements GameService {
@Override
public void startGame() {
System.out.println("text");
}
}
Decorator
와 같이 변수를 선언해준다.
public class GameServiceProxy extends GameService {
private GameService gameService;
@Override
public void startGame() {
long before = System.currentTimeMillis();
if(this.gameService == null) {
this.gameService = new DefaultGameService();
}
super.startGame();
System.out.println(System.currentTimeMillis() - before);
}
}
public class DefaultGameSErvice implements GameService {
@Override
public void startGame() {
System.out.println("text");
}
}
public class Client {
public static void main(String[] args) {
GameService gameService = new GameServiceProxy(new DefaultGameSErvice());
gameService.startGame();
}
}
DefaultGameService
는 자신의 일만 하고 다른 클래스에서 호출만 하게 된다.
Java Reflection
으로 제공되는 기능 중 하나로, 동적으로 실행될 때 Proxy 인스턴스가 생성된다.