Proxy Pattern 是一種結構型設計模式,用於代理或替換另一個對象以控制對原始對象的訪問
Proxy: 提供和 RealObject 相同的接口,並代理用戶對 RealObject 的訪問 (例: 透過 Proxy Server 控制 Client 對 DB 的訪問)
RealObject: 真正需要被訪問的對象 (例: 資料庫)
Client: 與 Proxy 而不是直接與 RealObject 交互 (例: 訪問資料庫的使用者或應用程式)
Proxy 有太多種變形了,沒辦法一一舉例...
// Image Interface
class Image {
public:
virtual void display() = 0;
};
// ReadImage Class,真正會從磁碟讀取圖片的類別
class RealImage : public Image {
private:
std::string fileName;
void loadFromDisk(std::string fileName) {
std::cout << "Loading " << fileName << std::endl;
}
public:
RealImage(std::string fileName) : fileName(fileName) {
loadFromDisk(fileName);
}
void display() override {
std::cout << "Displaying " << fileName << std::endl;
}
};
// ProxyImage Class,轉傳 Request 給 RealImage Class
class ProxyImage : public Image {
private:
RealImage* realImage;
std::string fileName;
public:
ProxyImage(std::string fileName) : fileName(fileName), realImage(nullptr) {}
void display() override {
// 若 RealImage 的實例尚未建立,則先建立之 (Lazy-Initialization)
if (realImage == nullptr) {
realImage = new RealImage(fileName);
}
// 委派 (Delegate) 給 RealImage 的 display 方法
realImage->display();
}
~ProxyImage() {
if (realImage) {
delete realImage;
}
}
};
// 使用 ProxyImage 來顯示圖像
int main() {
Image* image = new ProxyImage("test.jpg");
image->display(); // 第一次呼叫會加載圖像
image->display(); // 第二次呼叫不會重新加載,直接顯示
}
資源共享: 資源共享代理用於管理對有限資源的訪問,(例: 資料庫連接池 (Connection Pool),多個 Client 可以共享一組預先建立的資料庫連接)
安全性控制: Proxy Server 可以驗證 Client 的身份,只允許授權的 Client 訪問 DB
數據緩存 (Caching): Proxy Server 可以臨時存儲查詢結果,減少對 DB 的重複查詢
查詢優化: Proxy Server 可以對 Client 的查詢進行優化,然後再傳送到 DB
負載均衡: 如果有多個 DB 實例,Proxy Server 可以根据負載均衡算法分配請求
日誌紀錄 (Logging): Proxy Server 可以記錄所有對 DB 的訪問請求和結果