2020년 7월 7일 화요일

GOF Design Pattern - Proxy







설명


 주소와 메모리 상의 주소를 이어주는 역할을 함.

 디스크에 있는 대용량의 데이터, 운영체제의 보안 관련 요소, 네트워크 등 실제 데이터를 바로 주는 것이 비용이 큰 경우에 사용함.

그래서 실 주소를 숨기거나, 원할때 객체를 생성하거나, 객체의 지속적인 메모리 관리를 할 수 있게 함.

 그래서 Proxy 클래스와 적용될 클래스는 인터페이스가 같거나 서로 부분집합이어야 함. 마치 스마트 모인터처럼. 그렇게 해야지 마치 객체를 다루는 듯한 상태가 되기 때문. 


 종류가 다음과 같은 네가지가 있음.

 1. Remote Proxy : 
  
 => 서로 다른 주소 공간에 존재하는 객체를 가리키는 대표 객체.

 2. Virtual Proxy : 
 
 => 요청이 있을 때만 고비용 객체를 생성하고, 외에는 필요한 관련 데이터만 가지고 있음

 3. Protection Proxy

 => 원래 객체에 대한 실제 접근을 권한 등에 따라서 제어하는 보안용 프록시.

 4. Smart Reference

 => 우리가 아는 그거



예제 코드



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ImageProxy : public Graphic
{
public:
    ImageProxy();
    virtual ~ImageProxy();
 
    virtual void Draw(const Point& at) { GetImage()->Draw(at); }
    virtual const Point& GetExtent()
    {
        if (_extent == Point::ZERO)
            _extent = GetImage()->GetExtent();
        return _extent;
    }
protected:
    Image* GetImage(){ if (_image == nullptr) _image = new Image(); return _image;}
private:
    Image* _image = nullptr;
    Point _extent = 0;
};
 
cs


_Image, _extent 가 0 으로 초기된 것에 주목.

 값이 필요할 때 되어야지 데이터를 생성하는 virtual proxy 의 모습을 보여줌.

 에를 들어 GetExtent() 를 실행했을 때 이전에 이미지를 로드하지 않았으면 그때되서야 로드는 하는 LazyLoading 임.



추가 설명

 Decorator 패턴과 비슷한데 그건 서비스를 추가하기 위한 목적이고, Proxy 는 객체에 대한 접근을 제어하는 것이 목적임.





댓글 없음:

댓글 쓰기

List