실제 객체를 호출하기전 앞 단에서 호출되어 서비스를 위임하는 패턴. 주 목적은 접근제어. 접근제어에는 권한에 따른 접근 차단, 캐싱, 지연 로딩 등이 있다.
프록시 객체가 클라이언트의 모든 요청을 받아서 실제 객체에 대한 서비스에 대한 접근을 흐름을 제어하면서 서비스를 유연하게 제공할 수 있다.
예를 들어 리소스를 많이 잡아먹는 쿼리문을 각각의 클라이언트 들이 요청을 한다면 데이터베이스는 정말 느려진다
프록시는 데이터베이스 객체로 자신으로 변장한다. 프록시는 지연된 초기화 및 결과값 캐싱을 클라이언트와 실제 데이터베이스 객체가 알지 못하는 상태에서 처리할 수 있다.
public class GameService {
public void startGame() {
System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
}
}
public static void main(String[] args){
GameService gameService = new GameService();
gameService.startGame();
}
프록시 적용시
public interface GameService {
void startGame();
}
public class DefaultGameService implements GameService {
@Override
public void startGame() {
System.out.println("이 자리에 오신 여러분을 진심으로 환영합니다.");
}
}
public class GameServiceProxy implements GameService {
private GameService gameService;
@Override
public void startGame() {
System.out.println("게임 준비 중");
if (this.gameService == null) {
this.gameService = new DefaultGameService();
}
gameService.startGame();
System.out.println("게임 진행 완료");
}
}