Proxy Pattern
View all Design Patterns
객체에 대한 접근을 제어하거나 추가적인 기능을 제공하기 위한 방법이다.
Class Diagram
Abstract overview
위와 같이 Service
클래스는 Proxy
클래스의 생명주기를 따르게 되며, 클라이언트 코드는 ServiceInterface
에 의존하게 된다.
Concrete example
Code
interface Image {
displayImage(): void;
}
class RealImage implements Image {
private filename: string;
constructor(filename: string) {
this.filename = filename;
this.loadImageFromDisk();
}
private loadImageFromDisk() {
console.log(`Loading ${this.filename}`);
}
displayImage() {
console.log(`Displaying ${this.filename}`);
}
}
class ProxyImage implements Image {
private realImage: RealImage | null = null;
private filename: string;
constructor(filename: string) {
this.filename = filename;
}
displayImage(): void {
if (this.realImage === null) {
this.realImage = new RealImage(this.filename);
}
this.realImage.displayImage();
}
}
const imageA: Image = new ProxyImage("testA.jpg");
const imageB: Image = new ProxyImage("testB.jpg");
imageA.displayImage();
// Loading testA.jpg
// Displaying testA.jpg
imageB.displayImage();
// Loading testB.jpg
// Displaying testB.jpg
이때, ProxyImage
클래스는 기존의 Image
클래스를 구현하고 있고, RealImage
인스턴스를 내부적으로 만들어, 실제 이미지를 로드하는 작업을 위임받게 된다.
Pros and Cons
Pros
- Lazy initialization(지연 초기화)로 대상 객체의 생성을 지연시킬 수 있다. 객체가 실제로 필요할 때만 생성되기 때문에, 자원을 효율적으로 사용할 수 있다.
- 클래스가 인터페이스를 구현하기만 하면 클라이언트는 해당 클래스의 인스턴스가 프록시를 통해 생성됐는지 몰라도 된다.
Cons
- 프록시를 추가하면, 처리해야 할 계층이 하나 더 늘어나기 때문에, 응답 속도가 지연될 수 있다.
- 디버깅이 어려워질 수 있다.