Design Pattern - Proxy Pattern

Proxy Pattern

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴
Proxy Pattern : 프로세스간 통신 (Inter-Process Communication, IPC) 기반의 Client-Server 프로그램 모델

  • Server
#include <iostream>
#include "ecourse_dp.hpp"
#include "ICalc.h"
using namespace std;
using namespace ecourse;

class Calc : public ICalc
{
public:
	int Add(int a, int b) { return a + b; }
	int Sub(int a, int b) { return a - b; }
};
Calc calc;


int dispatch( int code, int x, int y )
{
	printf("[DEBUG] %d, %d, %d\n", code, x, y );

	switch( code )
	{
	case 1: return calc.Add( x, y);
	case 2: return calc.Sub( x, y);
	}
	return -1;
}

int main()
{
	ec_start_server("CalcService", dispatch);
}
  • Client
#include <iostream>
#include "ecourse_dp.hpp"
#include "ICalc.h"
using namespace std;
using namespace ecourse;

class Calc : public ICalc
{
    int server;
public:
    Calc() { server = ec_find_server("CalcService");    }

    int Add(int a, int b) { return ec_send_server(server, 1, a, b);}
    int Sub(int a, int b) { return ec_send_server(server, 2, a, b);}
};

int main()
{
    Calc* pCalc = new Calc;

	cout << pCalc->Add(1, 2) << endl;
    cout << pCalc->Sub(10, 8) << endl;
}

  • ICalc
// ICalc.h

// 참조계수를 책임지는 함수는 인터페이스에 있어야 한다.

struct IRefCount            // IUnknown
{
    virtual void AddRef() = 0;
    virtual void Release() = 0;
    virtual ~IRefCount()  {}
};

struct ICalc : public IRefCount
{
    virtual int Add(int a, int b) = 0;
    virtual int Sub(int a, int b) = 0;

    virtual ~ICalc() {}
};
  • Proxy 장점
    • 명령코드대신 함수호출 사용
    • 보안의 기능을 추가하거나, 자주사용되는 요청에 대한 캐쉬를 추가할 수 도 있다.
  • Proxy <-> Stub
    • Proxy는 함수 호출을 명령 코드로 변경해서 서버에 전달
    • Stub은 명령코드를 다시 함수 호출로 변경
    • Proxy는 Stub과 통신한다.
  • RPC (Remote Procedure Call)
    • 다른 프로세스에 있는 함수를 호출하는 개념
    • Java : RMI (Remote Method Inovocation)
  • 인터페이스와 참조계수
    • Proxy Design Pattern 에서는 인터페이스와 reference count를 구현
      • reference count를 책임지는 함수는 인터페이스에 있어야함
      • EX) ~~~API (interface)
      • EX) ~~~Connection Context (Handle reference count)
    • 참조계수 : reference count
      • 여러 객체가 하나의 자원을 공유
      • 단, 몇 개의 객체자 자원을 사용하는지 개수를 관리
  • 참고
    • Proxy pattern is used for protect resource or control accessibility
    • Sever will receive the following signal from Server
      • Connection Request
      • Subscribe Request
    • Client will receive the following signal from Server
      • Connection Cfm
      • Connection Rej
      • Subscribe Cfm
      • Subscribe Rej