為其他物件提供一種代理以控制對這個物件的存取。

本實作展示 虛擬代理:真實物件(RealSubject)建構昂貴(如大圖片載入、資料庫連線),代理(Proxy)持有指標,僅在首次呼叫 Request() 時才建立真實物件(延遲初始化)。
#ifndef PROXY_H
#define PROXY_H
class Subject {
public:
Subject() {}
virtual ~Subject() {}
virtual void Request() = 0;
};
class RealSubject : public Subject {
public:
RealSubject();
virtual ~RealSubject() {}
virtual void Request();
};
class Proxy : public Subject {
public:
Proxy();
virtual ~Proxy();
virtual void Request();
private:
RealSubject* m_pRealSubject;
};
#endif
#include "Proxy.h"
#include <iostream>
RealSubject::RealSubject() { std::cout << "Constructing a RealSubject\n"; }
void RealSubject::Request() { std::cout << "Request By RealSubject\n"; }
Proxy::Proxy() : m_pRealSubject(nullptr) { std::cout << "Constructing a Proxy\n"; }
Proxy::~Proxy() { delete m_pRealSubject; m_pRealSubject = nullptr; }
void Proxy::Request() {
if (!m_pRealSubject) {
std::cout << "Request By Proxy\n";
m_pRealSubject = new RealSubject(); // 延遲建構
}
m_pRealSubject->Request();
}
#include "Proxy.h"
#include <cstdlib>
int main() {
Subject* pProxy = new Proxy();
pProxy->Request(); // 首次呼叫觸發 RealSubject 建構
pProxy->Request(); // 後續直接委派
delete pProxy;
return 0;
}
| 變體 | 用途 | 關鍵點 |
|---|---|---|
| 虛擬代理 | 延遲建構昂貴物件 | 首次使用時才建立 RealSubject |
| 保護代理 | 權限控制 | 檢查呼叫者權限再決定是否轉發 |
| 遠端代理 | RPC/分散式系統 | 封裝網路通訊細節(Stub/Skeleton) |
| 智慧指標代理 | 參考計數、鎖定、快取 | std::shared_ptr、std::weak_ptr 即此類 |
| 快取代理 | 記憶運算結果 | Memoization、HTTP Proxy Cache |