프록시 패턴은 다른 객체에 대한 대리자 또는 대변자 역할을 하는 객체를 제공하는 패턴이다.
실제 객체에 대한 접근을 제어하거나, 객체에 부가적인 동작을 수행하거나, 객체에 대한 접근을 지연시키는 등의 목적으로 사용된다.
프록시 패턴을 사용하는 상황
- 접근 제어(Access Control):
- 실제 객체에 직접 접근하는 것을 허용하지 않고, 프록시를 통해 접근을 제어하는 경우 사용된다.
- 지연 로딩(Lazy Loading):
- 실제 객체가 필요할 때까지 생성 또는 초기화를 지연시키는 경우 사용된다.
- 추가 동작(Additional Behavior):
- 실제 객체에 접근하기 전에 추가적인 동작을 수행하고자 할 때 사용된다.
프록시 패턴의 구성 요소
- Subject(주체):
- 프록시와 실제 객체가 공통적으로 구현한 인터페이스 또는 추상 클래스.
- RealSubject(실제 주체):
- 실제 객체를 나타내며, 프록시에 의해 대체된다.
- Proxy(프록시):
- 실제 객체에 대한 참조를 갖고 있고, 실제 객체에 대한 접근을 제어하거나 부가적인 동작을 수행하는 객체.
// RealSubject와 Proxy가 구현할 인터페이스
interface Image {
void display();
}
// 실제 이미지 로딩을 담당하는 클래스
class RealImage implements Image {
private final String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
// 실제 이미지 로딩 로직
private void loadImageFromDisk() {
System.out.println("Loading image from disk: " + filename);
}
// 실제 이미지 출력 로직
@Override
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// RealSubject에 대한 접근을 제어하고 확장하는 클래스
class ImageProxy implements Image {
private RealImage realImage;
private final String filename;
public ImageProxy(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
// 프록시에서 실제 이미지 로딩을 수행
realImage = new RealImage(filename);
}
// 프록시에서는 실제 이미지에 대한 추가적인 작업 수행 가능
System.out.println("Image loading time measured.");
// 실제 이미지 출력 로직은 RealSubject에 위임
realImage.display();
}
}
// 이미지를 사용하는 클라이언트 코드
public class Client {
public static void main(String[] args) {
// 이미지 로딩 시간을 측정하는 프록시를 사용
Image image = new ImageProxy("example.jpg");
// 이미지 출력 요청
image.display();
// 이미지가 이미 로딩되어 있기 때문에 두 번째 호출에서는 측정하지 않음
image.display();
}
}
728x90
'디자인 패턴' 카테고리의 다른 글
State Pattern (0) | 2024.06.15 |
---|---|
Singletone Pattern (0) | 2024.06.15 |
Observer Pattern (0) | 2024.05.30 |
Mediator Pattern (0) | 2024.05.28 |
Iterator Pattern (0) | 2024.05.27 |