2009. 9. 18. 14:59 Programming/Design Pattern
1. 컨텍스트
특정 객체에 대한 접근을 통제하기 위해 대리 객체 혹은 위치를 지키는 역할(placeholder)을 제공할 수 있다. 커다란 이미지 객체를 생성하고, 초기화 하는 경우를 생각해보자. 특히, 네트워크를 통해 다운로드 받아서 객체를 생성하거나 초기화 하는 경우라고 하면, 상당한 시간이 소요될 것이다. 이러한 경우 실제 객체에 대한 대리자(proxy)를 생성하고, 객체에 대한 요청을 대신 수행할 수 있다. 단지, 실제 이미지를 화면에 표시해야 하는 경우처럼 반드시 실제 객체가 필요한 경우만 이를 생성하여 부하를 최소화 할 수 있다.
 
그러나, Proxy가 단지 이러한 용도에만 적용되는 것이 아니다. 아래 적용 영역 항목에서 일반적으로 Proxy가 사용되는 경우를 나열한다. 대개 단순한 포인터로서의 역할보다는 부가적인 기능을 수행하는 복잡한 레퍼런스(reference)가 필요할 때 많이 사용된다.
 
2. 적용 영역
l        Remote Proxy로서의 역할. 원격의 객체에 대한 로컬의 대리자(local representative)를 제공하는데 쓰인다.
l        Virtual Proxy로서의 역할. 많은 비용이 요구되는 객체를 생성하는 경우에 사용된다. 앞서 컨텍스트 항목에서 설명한 경우가 이러한 적용의 예다.
l        Protection Proxy로서의 역할. 보호가 요구되는 객체 자체에 대한 접근을 통제하고 대리자를 통해 접근 가능한 정도만 노출시키고자 할 때 쓴다.
l        Smart Reference로서의 역할. 객체에 대한 단순한 접근 이외의 부가적인 작업을 수행할 필요가 있을 때 사용한다.
 
3. 구조
 

4. 적용 결과
l        Remote Proxy를 사용하는 경우 객체의 원격지 존재 여부를 숨길 수 있다.
l        Virtual Proxy를 사용하는 경우 성능 최적화를 고려할 수 있다.
l        Protection Proxy와 Smart Reference를 사용하는 경우는 모두 객체에 접근할 때, 수반되는 부가적인 작업이 수행되는 것을 가능하게 한다.
 
5. 관련 패턴
l        Abstract Factory, Builder 및 Prototype을 비롯해서 많은 패턴과 병행해서 사용될 수 있다.
posted by 부풍