티스토리 뷰

Programming/Design Pattern

Proxy Pattern

군자동꽃미남 2015. 2. 11. 22:29
  • Proxy Pattern? 초기에 메모리에 올리지 않다가 필요할 때만 메모리에 올림. 메모리 사용 시간을 조금씩 늦쳐서 사용자로 하여금 빠르게 작업할 수 있도록 해주는 역할. 즉, 객체화의 비용을 줄임으로써 초기 시스템의 부하를 줄여주며 조금씩 메모리에 로딩함으로 시스템 자원의 부하를 분산시키는 것을 추구하는 패턴.
  • Virtual Proxy
    객체 생성에 많은 비용이 발생하는경우, 실제사용할때 객체가 생성되도록 대리자를 두어 접근하도록 제어한다.

  • Remote Proxy
    원격객체에 대한 로컬의 대리자 역활을 한다. Java RMI 를 통하거나 소켓통신을 통하여 원격객체에 데이터를 얻거나 메소드를 호출할 경우 대리자를 통하여 호출이 이루어진다.

  • Protection Proxy
    접근제어가 필요한 객체에 대한 접근을 통제하고 Proxy 객체를 통해 접근가능한 정도만 노출시킬때 사용한다.

  • Smart Reference
    실제객체에 접근할때 부가적인 기능을 수행하고자 할때 사용한다.




  • 예제 1
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    class CAnswerReal
    {
    public:
        CAnswerReal()
        {}
     
        // 실제 구현 메소드
        string getAnswer()
        {
            try{
                Sleep(10 * 500);
            }
            catch(...)
            {
            }
     
            string ans = "실제 데이터입니다.";
            return ans;
        }
    };
     
    class CAnswerProxy
    {
    public:
        CAnswerProxy()
        {
            mpRealData            = NULL;
            mGoFlag                = false;
        }
        ~CAnswerProxy()
        {
            if( mpRealData != NULL )
                delete mpRealData;
        }
     
    private:
        bool                    mGoFlag;
        CAnswerReal*            mpRealData;
     
    public:
        void action()
        {
            mGoFlag                = true;
        }
     
        // Proxy 메소드
        string getAnswer()
        {
            if( mGoFlag && ( mpRealData == NULL ) )
                mpRealData        = new CAnswerReal();
     
            if( mpRealData == NULL )
                return "질문에 대해 응답 중입니다";
     
            return mpRealData->getAnswer();
        }
    };
     
    void main()
    {
        CAnswerProxy* delay = new CAnswerProxy();
        printf("=== 질문입니다 ===\n");
     
        cout<<delay->getAnswer()<<endl;
     
        delay->action();
        cout<<delay->getAnswer()<<endl;
     
        delete delay;
    }
     

    cs


  • 예제 2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    class CSubject
    {
    public:
        virtual string getAnswer() = 0;
    };
     
    class CRealSubject : public CSubject
    {
    public:
        string getAnswer()
        {
            //TODO : DB처리등 시간이 오래 걸리는 작업을 실제 적용해야 하는 부분.
            Sleep(1000);
            return "실제 데이터입니다.";
        }
    };
     
    class CProxy : public CSubject
    {
    public:
        CProxy()
        {
            mpRealSub            = NULL;
        }
        ~CProxy()
        {
            if( mpRealSub )
                delete mpRealSub;
        }
     
    private:
        CRealSubject*            mpRealSub;
     
    public:
     
        string getAnswer()
        {
            if( !mpRealSub )
            {
                mpRealSub        = new CRealSubject();
                return "데이터 응답중입니다";
            }
     
            return mpRealSub->getAnswer();
        }
    };
     
    void main()
    {
        CSubject* data            = new CProxy();
     
        cout<<data->getAnswer()<<endl;
        
        cout<<data->getAnswer()<<endl;
     
        delete data;
    }
    cs


'Programming > Design Pattern' 카테고리의 다른 글

Singleton pattern  (0) 2015.01.25
Template Method & Factory Method Pattern  (0) 2015.01.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함