Post

Proxy Pattern

프록시 패턴에 대해 정리합니다.

Proxy Pattern

개요

  • 객체의 대리자 역할을 하는 객체를 통해 객체에 접근하는 패턴.
  • 가상 프록시, 보호 프록시, 원격 프록시 등 사용 방식에 따라 다양한 종류의 프록시가 있다.

사용하는 경우

  • 객체에 대한 접근을 제어하고 싶은 경우
  • 객체에 대한 추가적인 기능을 제공하고 싶은 경우

구성요소

  • Subject: 실제 객체와 대리자 객체가 구현해야 하는 인터페이스
  • RealSubject: 실제 객체
  • Proxy: 대리자 객체

  • Proxy Pattern

예제

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
#include <iostream>
#include <memory> // 스마트 포인터 사용

using namespace std;

class Subject {
public:
    virtual void request() = 0;
    virtual ~Subject() = default; // 가상 소멸자 추가 (메모리 릭 방지)
};

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

class Proxy : public Subject {
protected:
    unique_ptr<Subject> subject; // 스마트 포인터 사용

public:

    Proxy(unique_ptr<Subject> sub) : subject(move(sub)) {}

    void request() override {
        subject->request();
    }
};

int main() {
    unique_ptr<Subject> subject = make_unique<RealSubject>();
    unique_ptr<Subject> proxy = make_unique<Proxy>(move(subject));

    proxy->request();

    return 0;
}

위임 vs 상속 방식의 비교

  • 위임 방식: 대리자 객체가 실제 객체를 가지고 있어서 실제 객체의 메서드를 호출할 때 대리자 객체를 통해 호출한다.
  • 상속 방식: 대리자 객체가 실제 객체를 상속받아서 실제 객체의 메서드를 호출한다.
  • 상속 방식을 사용하면 위임 방식에 비해 구조가 단순해서 구현이 비교적 쉽다. 하지만, 상속 방식의 프록시는 객체를 생성하는 순간 실제 객체가 생성되기 때문에 가상 프록시를 구현하기에는 적합하지 않다.

프록시 패턴 vs 데코레이터 패턴

  • 두 패턴은 비슷한 구조를 가지고 있지만 목적이 다르다.
  • 프록시 패턴: 객체에 대한 접근을 제어하고 싶은 경우
  • 데코레이터 패턴: 객체에 대한 추가적인 기능을 제공하고 싶은 경우

클래스의 이름을 부여할 때 의도에 맞는 이름을 사용하는 것이 중요하다.

This post is licensed under CC BY 4.0 by the author.