프록시 패턴이란?

 

Proxy = 대리인

 

프록시 패턴이란 A라는 객체에 접근, 제어하기 위해서는 대리인인 proxyA를 통해서만 접근 가능하게 만드는 패턴이다.

A에 사용하는 인터페이스와 동일한 인터페이스를 proxyA가 제공해야 하며 proxyA객체는 A객체의 속성값을 변경시켜서는 안된다.

또한 게으른 초기화 방식을 사용해서 객체를 실제로 사용하기 전까진 객체 생성 및 초기화에 드는 코스트를 발생시키지 않는다.

 

사용 예시로는 ProxyA에서 A에 대한 접근 권한을 검증하거나, 접근 방식을 최적화하는 경우 등이 있다.

 

 

 

프록시 패턴의 구조

 

 

Subject는 추상클래스로 인터페이스만 작성한다.

RealSubject는 실제 접근하려는 A클래스이다.

Proxy는 A에 접근하기 위해 사용해야하는 ProxyA클래스이다.

 

Proxy가 RealSubject 객체를 멤버변수로 갖고, 요청이 들어왔을때 
RealSubject객체가 있다면 해당 동작을 호출하고, 없다면 게으른초기화로 객체생성한다.

 

 

 

구현 코드 예시

 

#include <iostream>
using namespace std;

class Subject {
public:
	virtual void request() = 0;
};

class RealSubject : public Subject {
public:
	void request() { cout << "RealSubject Requset" << endl; }
};

class Proxy : public Subject {
public:
	Proxy() :_realsubject(nullptr) {}
	~Proxy() { if (_realsubject) delete _realsubject; }

	void request() {
		if (!_realsubject)
			_realsubject = new RealSubject; // 싱글턴에서처럼 static으로 사용하는게 좋을것같음
                                           	 // static이면 적어도 객체 소멸할때 사라지긴 하므로 메모리누수 방지차원에서

		_realsubject->request();
	}
private:
	RealSubject* _realsubject;
};

int main() {
	Subject* Proxyptr = new Proxy();
	Proxyptr->request();

	delete Proxyptr;
	return 0;
}

 

 

 

 

 

 

※ 참고 문헌

https://mjdeeplearning.tistory.com/19

https://d-yong.tistory.com/49