public class ProxyImage implements Image {
private String path;
private RealImage image;
public ProxyImage(String path) {
this.path = path;
}
public void draw() {
if (image == null) {
image = new RealImage(path); // 최초 접근 시 객체 생성
}
image.draw(); // RealImage 객체에 위임
}
}
public class ListUI {
private List<Image> images;
public ListUI(List<Image> images) {
this.images = images;
}
public void onScroll(int start, int end) {
for (int i = start; i <= end; i++) {
Image image = images.get(i);
image.draw();
}
}
}
단일 책임 원칙
: 실제 객체와 프록시 객체의 책임이 분리되어있다.개방 폐쇄 원칙
: 프록시 객체를 사용하는 객체 관점에서는 새로운 기능이 추가되어도 여전히 프록시 객체인지 진짜 객체인지 알 수가 없다.리스코프 치환 원칙
: 인터페이스를 구현하면서 제공하는 기능이 구현체의 메서드로 대체 가능하다.인터페이스 분리 원칙
: 프록시 객체를 사용하는 객체 관점에서 필요한 기능으로 인터페이스를 분리했다.의존성 역전 원칙
: 프록시 객체와 프록시 객체를 사용하는 객체 모두 추상화된 인터페이스에 의존한다.프록시 객체는 실제 객체의 역할(외형)을 대신하다가 실제 객체가 필요할 때, 메시지를 대신하여 호출해주는 디자인 패턴이다. 실제 객체의 생성 비용이 큰 경우 지연 로딩을 통해 불필요한 메모리 낭비를 줄일 수 있는 장점 이 있다.
프록시 패턴은 Spring AOP, JPA 지연로딩 등 실제로 프레임워크에서도 많이 사용되는 유용한 패턴이다. 원리를 잘 알아두면 좋을 것 같다.