설명
주소와 메모리 상의 주소를 이어주는 역할을 함.
디스크에 있는 대용량의 데이터, 운영체제의 보안 관련 요소, 네트워크 등 실제 데이터를 바로 주는 것이 비용이 큰 경우에 사용함.
그래서 실 주소를 숨기거나, 원할때 객체를 생성하거나, 객체의 지속적인 메모리 관리를 할 수 있게 함.
그래서 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 는 객체에 대한 접근을 제어하는 것이 목적임.
댓글 없음:
댓글 쓰기