개발새발 2019. 12. 8. 12:01
반응형

Proxy Pattern (프록시 패턴)

목적

Proxy(대리자, 대리인) pattern은 A라는 객체를 접근, 제어하기 위해 대리자인 proxyA를 통해서만 접근 가능하도록 하는 구조를 만드는 패턴이다. 또한 

이 패턴은 A라는 객체를 실제로 사용하기 전까지는 객체 생성과 초기화에 들어가는 비용을 발생시키지 않겠다는 의미이다.(포인터와 유사)

또한 proxyA객체는 A객체의 속성값을 변경시켜서는 안된다.

 

 

사용 시나리오

  • 어떤 웹페이지 하단에 이미지가 존재한다고 가정한다.
  • 해당 이미지는 사용자가 스크롤을 내릴때만(필요할때만) 불러오게 구현한다.

 

[Subject(interface)]

class Image {
public:
    virtual void renderImage() = 0;
    virtual ~Image();
};

 

 

[Realsubject]

class RealImage : public Image {
public:
    RealImage(const string filePath) {
        cout<<"Load Image:"<<filePath<<endl;
    }
    void renderImage() override final {
        cout<<"Render real image"<<endl;
    }
};

 

[Proxy]

class ProxyImage : public Image {
public:
    ProxyImage(string filePath):realImage(nullptr) {
        this->filePath = filePath;
    }
    ~ProxyImage() override {
        if(realImage != nullptr)
            delete realImage;
    }
    void renderImage() override final {
        if(realImage == nullptr) {
            realImage = new RealImage(filePath);
        }
        realImage->renderImage();
    }
    
private:
    Image* realImage;
    string filePath;
};

 

 

[Client]

int main(int argc, const char * argv[]) {
    ProxyImage* proxyImage = new ProxyImage("/web/image/test.png");
    proxyImage->renderImage();
    
    delete proxyImage;
    return 0;
}

 

실행결과

Load Image:/web/image/test.png

Render real image

 

반응형